目录
封装:类是封装属性和方法的载体。类封装的目的是实现访问控制(该暴露的就暴露,不该暴露的就隐藏)。在控制权限上,属性和方法分为public(公共的)和private(私有的)两种,默认是公共的。
简单地讲,封装就是把属性和方法都放在一个类里面,而且还可以通过访问类的权限将属性给区分开,更加安全,不想要释放的功能,直接搞成私有机制。
1 属性的不同类型
1.1 类属性
类的属性可以通过类调用,也可以通过对象来调用,对于类的所有对象共同的属性,可以声明成类的属性。
类.属性
对象.属性
# 定义一个类
class Students():
#类的属性:用变量来表示
type="学生"
#类的方法:用函数来表示,但注意方法和函数两个概念有区别
def study(self):
return "学习软件测试技术!"
#实例化一个对象
stu1=Students()
#通过类调用类的属性
print(Students.type)
#通过对象调用类的属性
print(stu1.type)
1.2 实例属性(普通属性)
实例属性属于每个对象,每个对象的属性值可以不一样,实例属性通过对象来调用,实例属性是我们写得最多的属性。(前面在类中定义的属性(与方法同级的)是类属性,可以通过对象或类进行访问;在构造方法中定义的属性是实例属性,只能通过对象进行访问)
对象.属性
# 定义一个类
class Students():
#类的属性:用变量来表示
type="学生"
#构造方法
def __init__(self,name,age):
#实例的属性
self.Name=name
self.Age=age
#实例化一个对象
stu1=Students("张三",20)
#不能通过类调用实例的属性,因为这个属性属于对象而不属于类
print(Students.Name)
#通过对象调用实例的属性是Ok的
print(stu1.Name)
1.3 私有属性
属性和方法分为public(公共的)和private(私有的),默认是公共的。如果要声明私有的属性或方法,要在属性名或方法名前加__
(两个下划线),私有的方法不能通过类或者对象直接调用。
私有的属性或方法的调用方式:
-
通过定义公有的方法来间接地调用私有的属性或者方法;
-
通过
_类名__属性/方法
来调用,在python中没有绝对的私有,所谓的私有实际上是在名称前加了_类名
而已。
# 定义一个类
class Students():
# 类的属性:用变量来表示
type = "学生"
def __init__(self, name, age,weight):
# 实例的属性
self.Name = name
self.Age = age
#私有的属性
self.__Weight=weight
#声明一个共有的方法来间接地调用私有方法
def get_weight(self):
return self.__Weight
# 实例化一个对象
stu1 = Students("张三", 20, 80)
# 通过声明的共有方法来间接地实现私有属性的调用
print(stu1.get_weight())
# 通过在属性前加_类名来实现对私有方法的调用
print(stu1._Students__Weight)
在实际编程中,虽然Python无法实现绝对的私有,但我们可以通过声明私有属性或方法来告诉别人这个属性或方法是私有的,别人看到后就不会强制去调用,以免出现意料之外的结果。
1.4 实例属性与类属性重名
当实例属性和类属性重名时,通过类调用的默认是类属性,通过对象调用的默认是实例属性,相当于在对象中实例属性会覆盖类的属性。
# 定义一个类
class Students():
# 类的属性:用变量来表示
type = "学生"
def __init__(self,name,age,weight,type):
# 实例的属性
self.Na me = name
self.Age = age
#私有的属性
self.__Weight=weight
self.type=type
# 实例化一个对象
stu1 = Students("张三", 20, 80,"小学生")
# 重新传值覆盖类的属性的值
print(stu1.type)
print(Students.type)
#例如:
class Test(object):
val = 100
def __init__(self):
self.val = 200
test = Test()
test.val #输出200
Test.val #输出100
2 方法的不同类型
2.1 类方法(classmethod
装饰器)
使用classmethod
装饰器来装饰一个方法,可以把这个方法变成类的方法。类的方法的特点是:
-
类方法的第一个参数是类对象参数
cls
(cls
代表类本身),在调用的时候不需要对cls
传实参; -
如果一个方法被标示为类方法,则该方法可被类调用,也可以被类的对象调用。
# 定义一个类
class Students():
# 类的属性:用变量来表示
type = "学生"
#声明一个类方法
@classmethod
def get_age(cls):
return cls.type
# 实例化一个对象
stu1 = Students()
#通过类调用类的方法
print(Students.get_age())
#通过对象调用类的方法
print(stu1.get_age())
2.2 实例方法(普通方法)
实例的方法只能通过对象调用,这是我们写得最多的方法。
# 定义一个类
class Students():
# 类的属性:用变量来表示
type = "学生"
def __init__(self,name,age,weight,type):
# 实例的属性
self.Name = name
self.Age = age
#私有的属性
self.__Weight=weight
self.type=type
# 方法:用函数来表示,但注意方法和函数两个概念有区别
def study(self):
return "学习软件测试技术!"
def get_name(self):
return self.Name
# 实例化一个对象
stu1 = Students("张三", 20, 80,"小学生")
#通过对象调用实例方法
print(stu1.get_name())
2.3 静态方法(staticmethod
装饰器)
使用 staticmethod
装饰器来装饰一个方法,可以把它变成一个静态方法,静态方法不需要传形参self
和cls
(就像一个在类里面的普通函数)。静态方法可以用类来调用,也可以用对象来调用。
# 定义一个类
class Students():
# 类的属性:用变量来表示
type = "学生"
#声明一个静态方法
@staticmethod
def get_type():
return Students.type
# 实例化一个对象
stu1 = Students()
#通过类调用静态方法
print(Students.get_type())
#通过对象调用静态方法
print(stu1.get_type())
几种方法的使用场景:
-
如果某一个方法需要访问到对象的属性,可以把这个方法封装成一个实例方法;
-
那如果某一个方法不需要访问对象的属性,但是需要访问到类的属性,这个时候就可以考虑把这个方法封装成一个类方法;
-
如果要封装的某一个方法,既不需要访问到对象的属性,也不需要访问类的属性,这个时候就可以考虑把这个方法封装成一个静态方法。
2.4 私有方法(方法前面加两个下划线__
)
属性和方法分为public
(公共的)和private
(私有的),默认是公共的。如果要声明私有的属性或方法,要在属性名或方法名前加__
(两个下划线),私有的方法不能通过类或者对象直接调用。
私有的属性或方法的调用方式:
-
通过定义公有的方法来间接地调用私有的属性或者方法;
-
通过
_类名__属性/方法
来调用,在python中没有绝对的私有,所谓的私有实际上是在名称前加了_类名
而已。
# 定义一个类
class Students():
# 类的属性:用变量来表示
type = "学生"
#声明一个私有方法
def __get_type_2(self):
return self.type
#声明一个公有方法来间接地调用私有方法__get_type_2
def get_type_2(self):
return self.__get_type_2()
# 实例化一个对象
stu1 = Students()
# 通过声明的公有方法来间接地实现私有方法的调用
print(stu1.get_type_2())
# 通过在属性前加_类名来实现对私有方法的调用
print(stu1._Students__get_type_2())