首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用'__slots__‘时使用python

当我使用'__slots__‘时使用python
EN

Stack Overflow用户
提问于 2015-01-21 07:27:03
回答 5查看 409关注 0票数 1

最近我学习了Python,但是我有一个关于__slots__的问题。在我看来,它是为了限制Class中的参数,但也是为了限制Class中的方法?

例如:

代码语言:javascript
复制
from types import MethodType

Class Student(object):
  __slots__=('name','age')

当我运行代码时:

代码语言:javascript
复制
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?

EN

回答 5

Stack Overflow用户

发布于 2015-01-21 10:51:45

使用__slots__意味着您不会为每个类实例获取一个__dict__,因此每个实例都更加轻量级。缺点是您不能修改方法,也不能添加属性。而且你不能做你想做的事情,那就是添加方法(这将是添加属性)。

此外,pythonic方法不是实例化MethodType,而是简单地在类名称空间中创建函数。如果您正在尝试动态添加或修改函数,则只需将函数分配给类,如下所示:

代码语言:javascript
复制
Student.set_age = set_age

当然,如果实例使用__slots__,则不能将其分配给实例。

这是__slots__文档:https://docs.python.org/2/reference/datamodel.html#slots

票数 2
EN

Stack Overflow用户

发布于 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__声明阻止您添加新的实例属性。然而,如果你写给这个类,你就不会有任何问题:

代码语言:javascript
复制
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

如果您在将方法添加到其类之前创建了实例,则此代码也可以工作。

票数 1
EN

Stack Overflow用户

发布于 2015-01-21 07:31:14

您的属性实际上没有属性set_age,因为您没有为它创建一个槽。你还想要什么?

另外,它应该是__slots__而不是__slots (我认为这在你的实际代码中是正确的,否则你不会得到你得到的错误)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28057091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档