问题描述
当子类有与父类方法同名的方法时,子类的方法会覆盖父类的方法。
class Person:
def print(self):
print("Message from Person")
class Student(Person):
def print(self):
print("Message from Student")\
s = Student()
# Method of Student Class Instance
s.print() # Output: "Message from Student"
# I want to call method "print" of Person
# from student Instance
# How can I call it?
s.super().print() # ERROR
super(s).print() # ERROR
解决方法
如果绝对没有办法以任何其他方式访问父类,我想你可以这样做,但我绝对不推荐它:
class Person:
def print(self):
print("Message from Person")
class Student(Person):
def print(self):
print("Message from Student")
s = Student()
# Method of Student Class Instance
s.print() # Output: "Message from Student"
s.__class__.__base__.print(s.__class__.__base__) # Output: "Message from Person"
你必须明白这是超级hacky,你不是在调用实例的方法,就像s.print()
的情况一样,而是在调用一个未实例化的类的方法,一个方法这不是 classmethod
(或 staticmethod
就此而言)并将类作为参数传递给它(即 self
参数)。这是非常不同的语法。
再说一次,给方法不同的名字而不是覆盖它们更有意义。