在Python3中,如何在不同的类中使用相同的类属性?

在Python3中,如何在不同的类中使用相同的类属性?,python,python-3.x,oop,mixins,Python,Python 3.x,Oop,Mixins,我有两组属性,我想以相同的方式在不同的类中使用它们。我试图将这些集合作为类属性混合在一起,以避免super调用和不必要的复杂性: class Base: def printAttr(): print(attr) class MixIn1: attr = "Monty" class MixIn2: attr = "Python" class Combo1(Base, MixIn1): pass class Combo2(Base, MixIn

我有两组属性,我想以相同的方式在不同的类中使用它们。我试图将这些集合作为类属性混合在一起,以避免
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()
结果是
name错误:未定义名称“attr”
。显然,如果我显式调用
MixIn1.attr
,它会起作用,但这与将此代码放入类本身是一样的


如何以经济的方式为不同的
attr
s使用相同的处理逻辑

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

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

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

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

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

错误与显示的代码不匹配。请显示实际代码。您发布的代码将抛出TypeError,因为
printAttr
缺少
self
参数;修复该问题将引发NameError,因为该方法中未定义
attr
。此外,在
printtr
方法中缺少
self
参数。添加
self
参数并访问
self.attr
后,该方法工作正常。这看起来只是你的疏忽。你可以使用
self
。谢谢。我认为,
self
仅用于实例属性,而不是类属性。