Python:面向对象编程2
Posted Mr-chen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:面向对象编程2相关的知识,希望对你有一定的参考价值。
如何在class创建后,给实例绑定属性和方法? (动态绑定/定义)
class Student(object): pass s = Student() s.name = ‘Michael‘ # 动态给实例绑定一个属性 def set_age(self, age): # 定义一个函数作为s的实例方法 self.age = age from types import MethodType s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
??但这些方法/属性是这个实例特有的。如果要所有实例都能使用的话,可以这样:
Student.set_score = set_score
如此,就给Student绑定了一个方法。它的所有实例都可以调用。
解释一下:
动态定义方法,就是在代码开始运行后,通过定义一个新方法并绑定到已经定义的类或实例对象上,让类的所有实例或实例自身可以使用它。
??Ruby的动态定义方法使用define_method(symbol, method)或define_method(symbol){block}->symbol。
它的主要作用是在运行时决定方法的名字。这里比较不太合适。
但是,我们想要Student的实例的属性不能随意添加,必须限制,怎么做? ??
使用__slots__
class Student(object): __slot__ = (‘name‘, ‘age‘)
如果再想要,给实例添加其他属性就会报告?AttributeError。
使用@property
给类的实例添加属性。
首先,一个对一个实例属性的正常操作包括写入和读取,即要两个方法。
class Student(object): def get_score(self): return self._score def set_score(self, value): self._score = value
但这么写很费劲,而且调用的时候,不能直接使用属性的名字score。
Python也没有类似Ruby的写法:??下面代码是模仿Ruby。Ruby的 "name="也可以是方法名,并且有了赋值的功能。
class Student(object): def score(self): return self._score def score=(self, value): self._score = value s = Student() s.score = 11 print(s.score)
所以说很费劲。因此Python使用了自己的方法,这就是装饰器(decorator)的方法:@property
class Student(object): @property def score(self): return self._score @score.setter def score(self, value): self._score = value
>>> s = Student() >>> s.score = 60 # OK,实际转化为s.set_score(60) >>> s.score # OK,实际转化为s.get_score() 60
相当于score定义外面加了一层或几层定义def,这种代码的写法叫做装饰器。
@property相当于加上读方法,@xxx.setter相当于加上写方法。
??Ruby更简单直接用attr_accessor(symbol)来完成读写方法的定义。
例子:
- ??self._xxxx。加上一个下划线
- resolution是一个只读属性。他的内部是用self._width * self._height。
- 如果设resolution为一个普通方法,那么无法得到计算结果!!
class Screen(object): @property def width(self): return self._width @width.setter def width(self, value): self._width = value @property def height(self): return self._width @height.setter def height(self, a): self._height = a @property def resolution(self): a = self._width * self._height return a s = Screen() s.width = 1024 s.height = 768 print(‘resolution =‘, s.resolution) if s.resolution == 786432: print(‘测试通过!‘) else: print(‘测试失败!‘)
以上是关于Python:面向对象编程2的主要内容,如果未能解决你的问题,请参考以下文章