在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。 在处理上述异常时,发生了另一个异常: