Discuss / Python / 请教

请教

Topic source

_若逝

#1 Created at ... [Delete] [Delete and Lock User]

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)

_若逝

#2 Created at ... [Delete] [Delete and Lock User]

为什么输出是11,11而不是15,11?

崔皓mango

#3 Created at ... [Delete] [Delete and Lock User]
在此插入代码

class Student(object): name = 'Student' a=Student() print(Student.name,a.name)

运行下这段代码你就会懂!

@崔皓mango你那段代码是什么意思?实例肯定会继承类的属性,这行楼主的问题是一个么?(ps:新手不太明白)

張-教-主

#5 Created at ... [Delete] [Delete and Lock User]

@崔皓mango 为了让所有实例通用方法才给类绑定方法的,结果这样那不就没什么意义了么,所有的实例获取的属性值都一样了

楼主的问题是 实例用的是类的属性, 多个实例对类的属性进行更改 已最后一次更改的结果为准

John_啊呜

#7 Created at ... [Delete] [Delete and Lock User]

def set_age(self,age): self.age=age from types import MethodType Stu.set_age=MethodType(set_age,Stu)

这样给类绑一个方法的时候 貌似这个一起绑上去的age会被绑成类属性

土城剑客

#8 Created at ... [Delete] [Delete and Lock User]

楼主的问题就出在,该方法是绑定到了上而不是实例对象上,方法绑定到类上,该方法和类变量就相当于是类(实例的模板)的静态属性。

这里一步一步的来证明:

首先我们定义一个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

Reply