我这里有一段代码,我在其中定义了一个带有类方法和类变量的父类:
class Parent:
var1 = 'foo'
var2 = 'bar'
def getVar1Var2AsString(self):
return f'{Parent.getVar1()}_{Parent.getVar2()}'
@classmethod
def getVar1(cls):
return cls.var1
@classmethod
def getVar2(cls):
return cls.var2
然后,我有一个定义子类的代码:
class Child(Parent):
var1 = 'banana'
var2 = 'apple'
然后我跑:
child = Child()
output = child.getVar1Var2AsString()
print(output)
我预计输出会返回
banana_apple
,但它返回foo_bar
。
我怎样才能得到我期望的结果?我是 OOP 的新手。
在
getVar1Var2AsString
中,当您调用 Parent.getVar1()
时,您可以在不引用当前对象或其类的情况下执行此操作。它always查找Parent
上的方法。如果要查找当前对象类中的方法,请使用self.getVar1()
。你也根本不需要 getter 方法,你可以只使用 self.var1
和 self.var2
.
继承没问题,错误的是变量访问。在
getVar1Var2AsString
中,当您写 Parent
时,它总是指代 Parent
(当然),而不是 self
的类,它可以用 type(self)
得到。或者,如果您想查找实例上的类变量,只需使用 self
.
顺便说一句,我不认为吸气剂在这里添加任何东西。
所以:
def getVar1Var2AsString(self):
return f'{type(self).var1}_{type(self).var2}'
如果您想获得
foo_bar
,如果对象是Parent
类的实例,banana_apple
,如果它是Child
类的实例,您可以通过将getVar1Var2AsString
更改为
@classmethod
def getVar1Var2AsString(cls):
return f"{cls.getVar1()}_{cls.getVar2()}"
这样,相应类的值用于生成输出。