只读属性
- 概念:一个属性(一般指实例属性),
只能读取
,不能写入
1. 有些属性, 只限在内部根据不同场景进行修改, 而对外界来说, 不能修改, 只能读取 2. 比如电脑类的网速属性, 不可能外部设置多少网速, 就是多少网速, 只能从外部查看
- 经典类和新式类
1. 概念 (1) 经典类:没有继承 (object) (2) 新式类:继承 (object) 2. 注意 (1) Python2.x 版本定义一个类时, 默认不继承 (object) (2) Python3.x 版本定义一个类时, 默认继承 (object)
- 实现
1. property:将一些"属性的操作方法"关联到某一个属性中 (1) 在经典类中, 只能管理一个属性的读取操作 # _*_coding:utf-8_*_ class Person: def __init__(self): self.__age = 18 def get_age(self): print "-----get" return self.__age def set_age(self, value): print "-----set" self.__age = value age = property(get_age, set_age) p = Person() print p.age p.age = 19 print p.age print p.__dict__ # _*_coding:utf-8_*_ class Person: def __init__(self): self.__age = 18 @property def age(self): print "-----get" return self.__age @age.setter def age(self, value): print "-----set" self.__age = value p = Person() print p.age p.age = 20 print p.age print p.__dict__ (2) 在新式类中, 可以管理一个属性的改查删操作 class Person(object): def __init__(self): self.__age = 18 def get_age(self): print("-----, get") return self.__age def set_age(self, value): print("-----, set") self.__age = value age = property(get_age, set_age) p = Person() print(p.age) p.age = 20 print(p.age) class Person(object): def __init__(self): self.__age = 18 @property def age(self): print("-----, get") return self.__age @age.setter def age(self, value): print("-----, set") self.__age = value p = Person() print(p.age) p.age = 20 print(p.age)
2. 借助系统内置的方法进行拦截 class Person: """ (1) 当我们通过"实例.属性 = 值", 给一个实例增加一个属性, 或者修改一下属性值的时候, 都会调用这个方法; (2) 在这个方法内部, 才会真正地把这个属性, 以及对应的数据, 给存储到 __dict__ 字典里面 """ def __setattr__(self, key, value): print(key, value) if key == "age" and key in self.__dict__.keys(): print("这个属性是只读属性, 不能设置数据") else: self.__dict__[key] = value p = Person() p.age = 18 print(p.age) p.age = 20 print(p.age) print(p.__dict__)
- 内置特殊属性
1. 类属性 (1) __dict__: 类对象的属性 (2) __bases__: 类对象的所有父类构成元组 (3) __doc__: 类对象的文档字符串 (4) __name__: 类名 (5) __module__: 类定义所在的模块 class Person: """ 这是一个人类 """ def __init__(self): self.name = "王小熊" def play(self, ball): print(ball) print(Person.__dict__) print(Person.__bases__) print(Person.__doc__) print(Person.__name__) print(Person.__module__)
2. 实例属性 (1) __dict__: 实例对象的属性 (2) __class__: 实例对象对应的类对象 class Person: pass p = Person() p.name = "王小熊" print(p.__dict__) print(p.__class__)
网友评论