最近我学习了Python,但是我有一个关于__slots__的问题。在我看来,它是为了限制Class中的参数,但也是为了限制Class中的方法?
例如:
from types import MethodType
Class Student(object):
__slots__=('name','age')当我运行代码时:
def set_age(self,age):
self.age=age
stu=Student()
stu.set_age=MethodType(set_age,stu,Student)
print stu.age
An error has occurred:
stu.set_age=MethodType(set_age,stu,Student)
AttributeError: 'Student' object has no attribute 'set_age'我想知道,为什么不在这个类中使用set_age?
发布于 2015-01-21 10:51:45
使用__slots__意味着您不会为每个类实例获取一个__dict__,因此每个实例都更加轻量级。缺点是您不能修改方法,也不能添加属性。而且你不能做你想做的事情,那就是添加方法(这将是添加属性)。
此外,pythonic方法不是实例化MethodType,而是简单地在类名称空间中创建函数。如果您正在尝试动态添加或修改函数,则只需将函数分配给类,如下所示:
Student.set_age = set_age当然,如果实例使用__slots__,则不能将其分配给实例。
这是__slots__文档:https://docs.python.org/2/reference/datamodel.html#slots
发布于 2015-01-21 10:58:30
在新的样式类中,方法不是实例属性。相反,它们是通过定义__get__方法来遵循descriptor protocol的类属性。方法调用obj.some_method(arg)等同于obj.__class__.method.__get__(obj)(arg),反过来又等同于obj.__class__.method(obj, arg)。__get__实现执行实例绑定(调用时将obj作为method的第一个参数插入)。
在示例代码中,您尝试将一个手工绑定的方法作为已有实例的实例变量。这不起作用,因为您的__slots__声明阻止您添加新的实例属性。然而,如果你写给这个类,你就不会有任何问题:
class Foo(object):
__slots__ = () # no instance variables!
def some_method(self, arg):
print(arg)
Foo.some_method = some_method # this works!
f = Foo()
f.some_method() # so does this如果您在将方法添加到其类之前创建了实例,则此代码也可以工作。
发布于 2015-01-21 07:31:14
您的属性实际上没有属性set_age,因为您没有为它创建一个槽。你还想要什么?
另外,它应该是__slots__而不是__slots (我认为这在你的实际代码中是正确的,否则你不会得到你得到的错误)。
https://stackoverflow.com/questions/28057091
复制相似问题