【问题标题】:How to use the same class attributes in different classes in Python 3?如何在 Python 3 的不同类中使用相同的类属性?
【发布时间】:2017-12-11 19:03:36
【问题描述】:

我有两组属性,我想以相同的方式但在不同的类中使用它们。我试图将这些集合作为类属性混合,以避免super 调用和不必要的复杂性:

class Base:
    def printAttr():
        print(attr)

class MixIn1:
    attr = "Monty"

class MixIn2:
    attr = "Python"

class Combo1(Base, MixIn1):
    pass

class Combo2(Base, MixIn2):
    pass

c1 = Combo1()
print(c1.attr) # it is assigned
c1.printAttr()

结果是NameError: name 'attr' is not defined。显然,如果我显式调用MixIn1.attr,它将起作用,但将这段代码放入类本身也是一样的。

如何以经济的方式对不同的attrs 使用相同的处理逻辑?

【问题讨论】:

  • 错误与显示的代码不匹配。
  • 请显示实际代码。您发布的代码会抛出 TypeError,因为 printAttr 缺少 self 参数;并修复它会抛出 NameError,因为 attr 没有在该方法中定义。
  • 另外,您在printAttr 方法中缺少self 参数。
  • 添加self 参数并访问self.attr 后,它工作正常。这看起来只是你的粗心大意。
  • 你可以使用self

标签: python python-3.x oop mixins


【解决方案1】:

添加一个方法所需的位置参数(通常称为self),适当地使用它,它将按您的预期工作:

class Base:
    def printAttr(self):
        print(self.attr)

>>> c1 = Combo1()
>>> c1.printAttr()
Monty

>>> c2 = Combo2()
>>> c2.printAttr()
Python

【讨论】:

  • 谢谢。我认为self 仅用于实例属性,而不是类属性。
【解决方案2】:

快速提示:无论何时在类下使用函数(方法)时,始终在其参数中提供“self”。这是所有方法都必须的。事实上,如果你使用 Pycharm IDE,它会自动完成 self 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2018-11-03
    • 2017-02-19
    • 1970-01-01
    相关资源
    最近更新 更多