类中常用的三个装饰器
- @classmethod 标记为类方法,默认参数为"cls",类本身可以直接调用(类属性,类方法,类本身和实例都可以直接调用,实例属性和实例方法,类本身不能调用,所以将方法加上@classmethod 装饰器变成类方法后类本身就可以直接调用了)
- @staticmethod 标记为静态方法,默认不需要传参,类和实例都能调用
- @property 设置只读属性,被property装饰的方法可以像属性一样被实例调用,但是属性值为只读属性,不能被修改(毕竟原始还是个方法)
# 三个类装饰器
class MyTest(object):
def __init__(self, name):
self.name = name
@classmethod # 类方法
def add(cls): # 默认参数传cls==类本身,self==实例本身
print("add方法")
# print(cls)
@staticmethod # 静态方法 类本身和实例对象都能调用
def static(): # 默认不需要传参数,不像类方法默认传cls,实例方法默认传self
print("这个是静态方法")
@property # 作用:设置实例的只读属性,不允许被修改 ,不允许修改的属性这样设置
def Name(self):
print("被这个装饰的类方法,可以像是属性一样被调用")
name = "pro"
return name
def run(self):
print(self.name) # 实例属性 name 可以修改
print(self.Name) # 被@property装饰的方法可以像属性一样调用,不可被修改
# 实例
t = MyTest("DaBai")
# 类方法(classmethod)
MyTest.add() # 类直接调用
t.add() # 实例也能调用
# 静态方法(staticmethod)
MyTest.static() # 类直接调用
t.static() # 实例也能调用
# 只读方法(property)实例方法可以像属性一样调用
# 实例属性允许被修改或者添加
print(t.name)
t.name = "Bai"
print(t.name)
# property 设置只读属性不允许被修修
# t.Name = "PRO" # 报错:AttributeError: can't set attribute
print(t.Name) # 被property装饰的方法可以像属性一样调用 但是属性值为只读属性,不能被修改(毕竟原始还是个方法)
t.run()
类私有属性,私有方法,实例私有属性,私有方法
- "_name" 被单下滑线标识的名称,意位类中的私有产物,虽然不影响外界的调用,算是口头协约,外部别用,此属性或者方法仅为类内部用
- "__name" 被双下滑线标识的,也是类中的私有产物、外部不能直接调用,实现了伪私有,外界通过"_类名__name" 一样可以访问
class MyTest(object):
__age = 18 # 类私有属性,外界不能直接调用,伪私有,调用_MyTest__age 就等于调用__age
_Age = 18 # 口头私有,外界可以调用
def __init__(self, name):
self.__name = name
@classmethod # 类方法
def __add(cls):
print("add方法")
# print(cls)
def __run(self):
# 类内部私有的可以直接使用 ,外部不能
self.__add()
print(self.__name)
# 类私有属性
# 单下滑口头协约的可以调用
print(MyTest._Age)
# 双下滑不能直接被调用
# print(MyTest.__age) # AttributeError: type object 'MyTest' has no attribute '__age'
# print(MyTest.__dict__) # 查看对象属性的方法 '_MyTest__age': 18, 名字内部做的转换
print(MyTest._MyTest__age) # 调用转换的后的名字即可,所以叫做伪私有
# 如下都一个道理
# 私有类方法
MyTest._MyTest__add()
# 实例私有属性,方法
t = MyTest("DaBai")
print(t._MyTest__name)
t._MyTest__run()