当前位置: 首页 > 面试题库 >

__metaclass__在Python 3中

王棋
2023-03-14
问题内容

在Python2.7这个代码可以很好地工作,__getattr__MetaTable 运行。但是在Python 3中,它不起作用。

class MetaTable(type):
    def __getattr__(cls, key):
        temp = key.split("__")
        name = temp[0]
        alias = None

        if len(temp) > 1:
            alias = temp[1]

        return cls(name, alias)


class Table(object):
    __metaclass__ = MetaTable

    def __init__(self, name, alias=None):
        self._name = name
        self._alias = alias


d = Table
d.student__s

但是在Python 3.5中,我得到了一个属性错误:

Traceback (most recent call last):
  File "/Users/wyx/project/python3/sql/dd.py", line 31, in <module>
    d.student__s
AttributeError: type object 'Table' has no attribute 'student__s'

问题答案:

Python
3更改了您指定元类的方式,__metaclass__不再检查。

使用metaclass=...在类 签名

class Table(object, metaclass=MetaTable):

演示:

>>> class MetaTable(type):
...     def __getattr__(cls, key):
...         temp = key.split("__")
...         name = temp[0]
...         alias = None
...         if len(temp) > 1:
...             alias = temp[1]
...         return cls(name, alias)
...
>>> class Table(object, metaclass=MetaTable):
...     def __init__(self, name, alias=None):
...         self._name = name
...         self._alias = alias
...
>>> d = Table
>>> d.student__s
<__main__.Table object at 0x10d7b56a0>

如果需要在代码库中同时提供对Python
2和3的支持,则可以使用six.with_metaclass()基类生成器或@six.add_metaclass()类装饰器来指定元类。



 类似资料:
  • 问题内容: 我正在尝试使用PyGObject和python 3编写简单的图形编辑器。我需要使用鼠标绘制具有不同颜色和宽度的线条。我发现类似的例子很多本,但没有更复杂。 如何在“绘制”事件之间保存绘制的图像?是否有增量绘制方式,或者在每个“绘制”事件上都必须重新绘制窗格?我发现可以保存路径,但是如何保存绘制线条的宽度和颜色?有没有办法在’draw’回调之外创建图像并仅在回调内部应用(draw)它?

  • 我的系统是Windows10x64 现在我想安装pyicu,但遇到了这样的问题 使用缓存的PyICU-1.9。7.焦油。gz从命令python安装程序完成输出。py egg_info:Traceback(最后一次调用):文件“C:\Users\ANHVU\AppData\Local\Temp\pip-build-v5fb9ri4\pyicu\setup.py”,第12行,在ICU_VERSION=

  • 我正在使用Python 3.2。1并且我无法导入模块。我使用可以工作,但我不能将它与的一起使用,如下所示: 我得到以下错误: 当我写时,它说

  • 我使用CentOS(CentOSLinux版本7.5.1804(核心))远程(托管我的服务器,我想运行python脚本)最初安装了python2。 我安装了python3,但是,两个版本的路径似乎都无法识别: 奇怪的Python3确实已安装,路径无法识别。无法运行脚本文件(使用)。

  • 我正在尝试用Ubuntu在Linux的Windows子系统上配置。 我也读了以下的帖子,帖子1,帖子2,和其他几个。这些似乎都不能解决我的问题。 任何帮助都将不胜感激。

  • 我正在尝试使用urllib访问JSON。要求urlopen。在python2中使用urllib2时效果很好,但不是urllib。要求urlopen。 在处理上述异常时,发生了另一个异常: