标签:imp 报告 下划线 就会 ESS 自己的 attribute col 失败
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绑定了一个方法。它的所有实例都可以调用。
解释一下:
动态定义方法,就是在代码开始运行后,通过定义一个新方法并绑定到已经定义的类或实例对象上,让类的所有实例或实例自身可以使用它。
它的主要作用是在运行时决定方法的名字。这里比较不太合适。
但是,我们想要Student的实例的属性不能随意添加,必须限制,怎么做? ??
class Student(object): __slot__ = (‘name‘, ‘age‘)
如果再想要,给实例添加其他属性就会报告?AttributeError。
给类的实例添加属性。
首先,一个对一个实例属性的正常操作包括写入和读取,即要两个方法。
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)来完成读写方法的定义。
例子:
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(‘测试失败!‘)
标签:imp 报告 下划线 就会 ESS 自己的 attribute col 失败
原文地址:https://www.cnblogs.com/chentianwei/p/11829265.html