Discuss / Python / 好乱。。。

好乱。。。

Topic source

关于第一部分: 首先,结果是没有问题的,但是结论我认为是有问题的。 可通过在方法里定义限制之外的属性来添加本不能添加的属性(当然,前提是方法没有被限制) 从你的代码来看,在slots里也添加了方法'set_city' 如果我没有理解错的话,这里是想说添加这个方法不被限制。 但是,slots只是对实例的属性做限制,并不限制类的方法和属性。 也就是说,有没有这个'set_city',结果是一样的。

def set_city(self, city):
    self.city=city

class Student(object):
    __slots__ = ('name', 'age')
    pass

from types import MethodType
Student.set_city = MethodType(set_city, Student) # 给类绑定新的类方法
# 给类追加的方法,并不受__slots__的限制

a = Student()
a.set_city('Beijing')
print(a.city)

接下来,关于第二部分: 结论我认为没有问题,但是,因为set_city这个方法是一个含有self的方法,从理论上来说,即使被追加到class中去,这个方法就变成了一个类方法,但是因为依旧是self.city的形式,这个city应该是一个实例属性才对,为什么是一个类属性呢? 难道通过MethodType给类追加方法,这个方法中的属性也会变成类属性?

类属性的定义:(引用实例属性和类属性那节) 如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有:

class Student(object):
    name = 'Student'
# -*- coding: utf-8 -*-
# slots只能限制添加实例属性,并不能限制通过添加方法来添加类属性

def set_city(self, city):
    self.city=city

class Student(object):
    __slots__ = ('name', 'age')
    pass

from types import MethodType
Student.set_city = MethodType(set_city, Student) # 给类绑定新的类方法
# 给类追加的方法,并不受__slots__的限制
# 通过给Student类绑定方法,实现了绑定了一个类属性,而不是实例属性

a = Student()
a.set_city('Beijing') # 调用类方法,为类属性city赋值
print(a.city)
# 所以这时,对于实例a来说,并没有实例属性city才对
del a.city # 报错!
# AttributeError: 'Student' object attribute 'city' is read-only

Reply