首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python3中覆盖类属性访问

如何在python3中覆盖类属性访问
EN

Stack Overflow用户
提问于 2017-10-25 07:40:36
回答 1查看 198关注 0票数 1

我正在试图覆盖python3中的类属性访问。我已经找到这个问题了,answered for python2。但与Python3不同的是,情况并非如此。请帮助我理解为什么这不适用于Python3,以及如何使它工作。

下面是我试图在Python3中验证的代码:

代码语言:javascript
复制
class BooType(type):
    def __getattr__(self, attr):
        print(attr)
        return attr

class Boo(object):
    __metaclass__ = BooType

boo = Boo()
Boo.asd     #Raises AttributeError in Python3 where as in Python2 this prints 'asd'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-25 14:53:04

来自http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Metaprogramming.html

Python 3改变了元类钩子。它并不不允许__metaclass__字段,但它忽略它。相反,在基类列表中使用关键字参数:

在您的情况下,您必须更改为:

代码语言:javascript
复制
class Boo(object, metaclass = BooType):
    pass

而且这很管用。不过,这个语法与python 2不兼容。

有一种方法可以创建兼容的代码,在idioms.html#metaclasses中可以看到

代码语言:javascript
复制
# Python 2 and 3:
from six import with_metaclass
# or
from future.utils import with_metaclass

class Boo(with_metaclass(BooType, object)):
    pass
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46926658

复制
相关文章

相似问题

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