类进阶

类中常用的三个装饰器

  • @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()

猜你喜欢

转载自www.cnblogs.com/jiangmingbai/p/10903621.html