首页 > 代码库 > 第七章-面向对象高级编程
第七章-面向对象高级编程
1 使用__slots__
1.1 绑定属性和方法
给实例绑定属性
class Student(object): pass>>> s = Student()>>> s.name = ‘Michael‘ # 动态给实例绑定一个属性>>> print(s.name)Michael
给某个实例绑定方法
>>> def set_age(self, age): # 定义一个函数作为实例方法... self.age = age...>>> from types import MethodType>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法>>> s.set_age(25) # 调用实例方法>>> s.age # 测试结果25
但是由于给实例绑定的方法, 别的实例无法使用
因而需要给类绑定方法:
>>> def set_score(self, score):... self.score = score...>>> Student.set_score = set_score
1.2 限定绑定属性
由于Python可以随意的增加属性, 因而为了针对这种情况, 可以在定义函数的时候定义__slots__来限制类里面只有哪一系属性, 这样绑定别的属性就会报错.
class Student(object): __slots__ = (‘name‘, ‘age‘) # 用tuple定义允许绑定的属性名称
2 使用@property
在之前说到, 私有变量要封装在对外公开的函数上, 要生成getter和setter函数.
但是在使用过程中, 还需要对设置的时候传入的参数进行一定的检查.
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!‘) self._score = value
为了追求完美, Python提供一个处理getter和setter的装饰器: Property
class Student(object): @property 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
经过这样的处理之后
>>> s = Student()>>> s.score = 60 # OK,实际转化为s.set_score(60)>>> s.score # OK,实际转化为s.get_score()60>>> s.score = 9999Traceback (most recent call last): ...ValueError: score must between 0 ~ 100!
第七章-面向对象高级编程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。