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__”

AttributeError:“UUID”对象在使用与后端无关的 GUID 类型时没有属性“replace”

AttributeError:“NoneType”对象没有属性“_inbound_nodes”