假设我有一个定义__slots__的类:
class Foo(object):
    __slots__ = ['x']

    def __init__(self,x=1):
        self.x = x

    # will the following work?
    def __setattr__(self,key,value):
        if key == 'x':
            object.__setattr__(self,name,-value) # Haha - let's set to minus x

我可以为它定义__setattr __()吗?

由于Foo没有__dict__,它会更新什么?

解决方法

除了否定值之外,你的所有代码都会调用父类__setattr__,这正是没有你的__setattr__方法会发生的事情.所以简短的回答是:当然你可以定义一个__setattr__.

你不能做的是重新定义__setattr__以使用self .__ dict__,因为带槽的类的实例没有__dict__属性.但是这样的实例确实有一个self.x属性,它的内容只是没有存储在实例上的字典中.

相反,插槽值存储在__dict__实例字典将以其他方式存储的相同位置;在对象堆上.为len(__ slots__)引用保留空间,类上的descriptors代表您访问这些引用.

因此,在__setattr__钩子中,您可以直接调用这些描述符:

def __setattr__(self,value):
    if key == 'x':
        Foo.__dict__[key].__set__(self,-value)

有趣的绕道:是的,在没有__slots__属性的类上,有一个描述符可以让你访问实例的__dict__对象:

>>> class Bar(object): pass
... 
>>> Bar.__dict__['__dict__']
<attribute '__dict__' of 'Bar' objects>
>>> Bar.__dict__['__dict__'].__get__(Bar(),Bar)
{}

这是正常情况下如何查找自我.__ dict__.这让你想知道Bar .__ dict__对象的位置.在Python中,它是turtles all the way down,你当然会在类型对象上看到该对象:

>>> type.__dict__['__dict__']
<attribute '__dict__' of 'type' objects>
>>> type.__dict__['__dict__'].__get__(Bar,type)
dict_proxy({'__dict__': <attribute '__dict__' of 'Bar' objects>,'__module__': '__main__','__weakref__': <attribute '__weakref__' of 'Bar' objects>,'__doc__': None})

python – 可以在__slots__类中定义__setattr __()吗?的更多相关文章

  1. Python类的定义和使用详情

    这篇文章主要介绍了Python类的定义和使用详情,在Python中,类表示具有相同属性和方法的对象的集合,文章围绕主题相关资料展开更多的相关介绍,需要的小伙伴可以参考一下

  2. 正则表达式基础教程

    但是在这之前,先详细的整理一下Python中的正则表达式的相关内容。正则表达式在Python爬虫中的作用就像是老师点名时用的花名册一样,是必不可少的神兵利器。Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

  3. centos6.4下yum报错实例

    找不到Python2.6.6,然后我解压下载了Python2.6.5,然后安装,安装过程如下:安装成功然后执行yum,依然是这一问题,我想着是不是环境变量的问题,于是增加了环境变量又出现了没有权限的问题,然后我还是将配置文件修改为然后执行,出现了Nomodulenamedyum问题,查看Python路径然后发现Python路径混乱比较混乱。方法二:就是将Python回滚到默认的2.6.6版本。我再次尝试着重新安装yum和Python。

  4. centos6.4升级Python过程总结

    1、查看Python环境:2、下载Python包并解压3、编译安装4、创建软连接5、检查是否成功当出现Python2.7.3即为安装成功##################################################因为Python版本升级后,yum会出现不可用现象,所以解决这一现象的方法就是:1、修改yum配置文件:修改第一行OK,完成只要安照这个步骤,不要乱改文件,一般不会出什么错。如果出错了,可以在我的另一篇博文中寻找方法。

  5. java – Python真的为每个新实例创建了所有绑定方法吗?

    我正在阅读Python(3.4)中的类,根据我的理解,似乎每个新对象都有自己的绑定方法实例.输出为False.这在我看来是浪费记忆.我认为内部a.foo和b.foo会以某种方式内部指向内存中的一个函数:A.foo将传递self作为类实例.我认为这可能无法在语言中轻松实现.每个新实例是否还包含其绑定方法的新实例?如果是这样,这对于创建新对象的性能是否有害,或者比在Java中的对象之间“共享”方法的其他语言更谨慎?

  6. Boost-python如何将c类实例传递给python类

    解决方法通过boost::python::ptr将对象指针传递给python.这将阻止python解释器复制:

  7. c – Python C-API对象分配

    我想使用new和delete运算符来创建和销毁我的对象.问题是python似乎将其分解为几个阶段.用于创建的tp_new,tp_init和tp_alloc以及用于销毁的tp_del,tp_free和tp_dealloc.但是c只有new,它分配并完全构造对象和删除对象的析构和解除分配.我需要提供哪些pythontp_*方法以及它们必须做什么?我也希望能够在python中继承我的扩展类型,我需要做些什么来支持它?

  8. c – Boost Python中的交叉模块依赖关系

    假设我有两个boostpython模块,定义如下.模块A:和模块B:模块B依赖于模块A.现在,我执行以下python脚本:我收到以下错误:似乎Python不会自动在模块之间转换类.有谁知道如何解决这个问题?

  9. 从C定义Python类

    我为Python包装了一些C代码并且它可以工作.C模块创建一个句柄,我将其作为PyCapsule传递给Python.我想要的API可以用Python制作:所以问题更多是一个整容问题.我是否必须包装包装器,或者我可以将上面显示的代码移动到C代码中,即导出类而不是一堆函数?

  10. 从Objective-C调用Python

    我正在开发一个Python/ObjC应用程序,我需要在ObjC的Python类中调用一些方法.我尝试了几件事没有成功.>如何从Objective-C调用Python方法?解决方法使用PyObjC.它包含在Leopard&后来.它甚至适用于iPython:`要从Objective-C调用Python,最简单的方法是:>在Objective-C中声明一个包含要调用的API的抽象超类>在类的@implementation中创建方法的存根实现>在Python中对类进行子类化并提供具体实现>在抽象超类上创建

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部