Discuss / Python / 好乱。。。

好乱。。。

Topic source

def init(self,name)定义错误 应该是def init(self,name)

总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。

我感觉是你还没弄懂_slots_的作用,廖老师文档里写得很清楚:_slots_的作用是限制实例的属性添加的,但你的set_city方法中的city是类变量并不是实例变量(尽管实例可以访问到city),所以你说slots并不能完全限制属性添加是错误的!

楼上加一,实际上第一段代码添加的是类属性而不是实例属性

有一点特别不明白:用MethodType绑定到类和把方法直接写到类里为什么实例的属性值会不同?比如:

from types import MethodType
def set_age(self,age):
    self.age=age
class Stu(object):
    pass
Stu.set_age=MethodType(set_age,Stu)
a=Stu()
s=Stu()
a.set_age(10)
s.set_age(15)
print(a.age,s.age)\\15 15

显然无论是a.set_age(10)还是s.set_age(15)都把类的属性值给改了,感觉大家指向的是同一个地方。

但如果是在一开始就在类里声明了set_age这个方法,而不是动态的绑定,结果就不一样了。

class Student(object):
    def set_age1(self,age):
        self.age=age
a=Student()
s=Student()
a.set_age1(10)
s.set_age1(15)
print(a.age,s.age)\\10 15

感觉这里面a和s两个实例里面都有age属性,set_age1改变的是实例属性值。

所以,我就不明白了,MethodType动态绑定这种东西到底绑了什么?为什么把类绑定方法之后,其实例可以用这个方法,但是没有里面的属性呢?还有类里面有1,2,3个属性,其实例不应该一上来就有1,2,3这3个属性么?怎么还能类里有的属性,实例没有呢?

晕了,习惯了静态的各种声明,动态的直接蒙圈了。。。。

我也遇到了上述的问题,给类A添加新的方法是指给A添加新的属性,但是为什么实例a.set_name无法改变属性啊,使用dir(a)后里面有set_name的方法啊

丁磊BLH

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

def set_name(self,name): self.name2 = name

A.set_name = MethodType(set_name,A)

// 我觉得动态绑定方法是给原类开辟一个新的内层空间,但如果 // 空间跟原类同名了就会被隐藏。我把你的self.name改成name2就好了 // 不知道这样理解对不对。请指教!

牙神牙拔

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

1、slots只是在限制类的属性,而没有限制类添加方法。

 __slots__ = ('name', 'age', 'set_city')

所以你在slots__限制的set_city方法根本没用,去掉也一样能使用Method添加方法 Student.set_city = MethodType(set_city, Student)

你这里的

a1 = A('a1')

是在初始化的时候赋予对象a1一个实例属性name 而当你用

A.set_name = MethodType(set_name,A)

的时候你又为类A赋予了一个类属性name 这样就导致你的代码中

a1.set_name('A1')

实际上是为类attribute (name)赋予了具体的值'A1' 而由于实例a1的实例属性name和类属性name同名并且a1已经为自己的实例属性name赋值了,所以也就覆盖掉了类属性name的值'A1'.

PS:你可以在你的代码最后输

print(A.name)

看看是不是得到的结果为'A1'

_是萤火虫

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

a.set_age(15) \通过set_age方法,设置的类属性age的值 s.set_age(11) \也是设置类属性age的值,并把上个值覆盖掉 print(s.age,a.age) \由于a和s自身没有age属性,所以打印的是类属性age的值

一样的输入,为何我这里没有出现覆盖,还是11,15


Reply