AttributeError:类型对象x没有属性y和Python 3.4的其他一些不一致

时间:2015-02-24 09:57:08

标签: python class oop python-3.x metaclass

我正在学习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')有效。

我不明白所有这些事情背后的背景。

1 个答案:

答案 0 :(得分:2)

您有三个不同的问题:

  1. Python 2.x和3.x中的元类语法为different

      

    PEP 3115:新的元类语法。而不是:

    class C:
        __metaclass__ = M
        ...
    
         

    你现在必须使用:

    class C(metaclass=M):
        ...
    
         

    不再支持模块全局__metaclass__变量。 (如果不从object派生每个类,就可以更容易地默认使用新式类。)

  2. 代码导致的错误:

    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
    
  3. 在Python 3中,print is a function

  4. 注意:碰巧您在此问题中提出的三个问题相当容易解决,但一般情况下,如果您遇到多个问题,则应ask about each in a separate question