请教
Topic source在此插入代码
class Student(object): name = 'Student' a=Student() print(Student.name,a.name)
运行下这段代码你就会懂!
def set_age(self,age): self.age=age from types import MethodType Stu.set_age=MethodType(set_age,Stu)
这样给类绑一个方法的时候 貌似这个一起绑上去的age会被绑成类属性
楼主的问题就出在,该方法是绑定到了类
上而不是实例对象
上,方法绑定到类上,该方法和类变量就相当于是类(实例的模板)的静态属性。
这里一步一步的来证明:
首先我们定义一个Stu类:
class Stu(object):
pass
#先不着急实例两个对象,只实例一个s
s = Stu()
def set_age(self,age): #定义待绑定函数
self.age=age
from types import MethodType
Stu.set_age = MethodType(set_age,Stu) #这里是对Stu的绑定而不是s的绑定
dir(s)
执行dir(s)
后发现多了一个类方法 set_age
```['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__',
'__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'__weakref__', 'set_age']
s调用该方法后,dir(s)
会多出一个类属性age
>>>dir(s)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'set_age']
现在我们直接实例化a
执行dir(a)
发现a中已经有了age
属性和set_age
方法了,而且a.age =11
因此,直接通过绑定类属性的方法修改的属性改的是类属性而不是对象的属性
>>>a = Stu()
>>>dir(a)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'set_age']
>>>a.age
11
直接绑定到对象
```class Stu1(object): pass
>>> s1 =Stu1()
>>> s1.set_age =MethodType(set_age,s1) #绑定到对象
>>> dir(s1)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'set_age']
>>> s1.set_age(11)
>>> dir(s1)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'set_age']
>>> s1.age
11
>>> a1=Stu1() #实例化a
>>> dir(a1)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
a
并没有age
属性和set_age
方法
- 1
_若逝
class Stu(object): pass s=Stu() a=Stu() def set_age(self,age): self.age=age from types import MethodType Stu.set_age=MethodType(set_age,Stu) a.set_age(15) s.set_age(11) print(s.age,a.age)