我正在学习Python类和元类。
以下示例已在现已解散的网站"Metaclasses Demystified"上的文章cleverdevil.org中进行了修改。
# metaclass methods
class Meta(type):
def show(cls):
return 'I am a Meta class method'
class Mistake(object):
__metaclass__ = Meta
但是我遇到了这个print语句的错误:
>>> 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')
有效。
我不明白所有这些事情背后的背景。
答案 0 :(得分:2)
您有三个不同的问题:
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