AttributeError:类型对象 x 没有属性 y 以及与 Python 3.4 的其他一些不一致 [关闭]
Posted
技术标签:
【中文标题】AttributeError:类型对象 x 没有属性 y 以及与 Python 3.4 的其他一些不一致 [关闭]【英文标题】:AttributeError: type object x has no attribute y and some other inconsistencies with Python 3.4 [closed] 【发布时间】:2015-04-25 21:26:28 【问题描述】:我正在学习 Python 类和元类。
下面是一个示例,该示例是从现已解散的网站 cleverdevil.org 上的文章 "Metaclasses Demystified" 修改而来的。
# metaclass methods
class Meta(type):
def show(cls):
return 'I am a Meta class method'
class Mistake(object):
__metaclass__ = Meta
但是我遇到了这个打印语句的错误:
>>> print(Mistake.show())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Mistake' has no attribute 'show'
下面是同类型的另一个例子。
# data hiding
class Fruit:
__price = 0
def show(self):
self.__price += 1
print (self.__price)
objFruit = Fruit()
objFruit.show()
objFruit.show()
objFruit.show()
print (objFruit._Fruit.__price) # error
另外,我收到print 'hello'
的错误,但print('hello')
有效。
我不明白这一切背后的背景。
【问题讨论】:
【参考方案1】:你有三个不同的问题:
元类语法在 Python 2.x 和 3.x 中为 different:
PEP 3115:新的元类语法。而不是:
class C: __metaclass__ = M ...
你现在必须使用:
class C(metaclass=M): ...
不再支持模块全局
__metaclass__
变量。 (这是一个拐杖,可以更容易地默认使用新式类,而无需从object
派生每个类。)
您的代码导致的错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Fruit' object has no attribute '_Fruit'
... 不难理解:您的Fruit
对象objFruit
没有属性_Fruit
。双下划线名称修改doesn't work the way you appear to think。这有效:
print(objFruit._Fruit__price) # no period
在 Python 3 中,print
is a function。
注意:碰巧你在这个问题中提出的三个不同的问题很容易解决,但一般来说,如果你有多个问题,你应该ask about each in a separate question。
【讨论】:
感谢您的信息。以上是关于AttributeError:类型对象 x 没有属性 y 以及与 Python 3.4 的其他一些不一致 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:类型对象“问题”没有属性“实际问题”[关闭]
django - AttributeError:类型对象'file'没有属性'set_user'
AttributeError:类型对象“用户”没有属性“用户名字段”
AttributeError:类型对象“numpy.ndarray”没有属性“__array_function__”