Python 类
- 访问限制
-
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。
class Student(object): def __init__(self, name, score): self.__name = name self.__score = score
-
但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:
class Student(object): def get_name(self): return self.__name def get_score(self): return self.__score
-
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
class Student(object): def set_score(self, score): self.__score = score
- 继承的好处
- 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
- slots
-
如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:
class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
- 使用@property
-
为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:
class Student(object): def get_score(self): return self._score def set_score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') # 执行了raise语句,raise后面的语句将不能执行 self._score = value
-
但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。Python内置的@property装饰器就是负责把一个方法变成属性调用的。
- 把一个getter方法变成属性,只需要加上@property就可以了。
- 被 @属性名.setter 装饰的方法是设置属性值的方法。
- 被 @属性名.deleter 装饰的方法是删除属性值的方法。
class Student(object): @property # property将 score() 方法转化成同名只读属性的 getter 方法。 def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value
- getitem
- 获取某个元素
- getattr
- 正常情况下,当我们调用类的方法或属性时
- call
- 一个对象实例可以有自己的属性和方法.
- super
- super() 函数是用于调用父类(超类)的一个方法。super 是用来解决多重继承的顺序问题的。
- Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
class A: def run(self): print('run') # python 2.x class B(A): def run(self): super(B,self).run() # python 3.x class B(A): def run(self): super().run()