我知道这 question 。我很相似,但不一样,因为我覆盖了所说的方法。我无法使用@staticmethod
,因为我需要在self
以及该类的其他函数中使用它。
我有class Player
和class Dealer
。在Player
中,我定义了一个名为print_cards
的方法。在课程Dealer
中,我覆盖了这个方法。如何让经销商实例使用Player
的{{1}}方法而不是自己的?
print_cards
答案 0 :(得分:3)
你的意思是这样的?没有super(),你没有完全覆盖父方法,只需重新定义它。 (但不确定,如果可以,我会尽量避免继承。)
class Player():
def print_cards(self):
print('I am in Player\'s class.')
class Dealer(Player):
def print_cards(self):
print('I am in Dealer\'s class.')
def print_player(self):
super().print_cards()
p = Player()
d = Dealer()
p.print_cards()
d.print_cards()
d.print_player()
输出是:
I am in Player's class.
I am in Dealer's class.
I am in Player's class.
虽然指定为Python 3问题,但这是你在Python 2中的表现方式
class Player(object):
def print_cards(self):
print('I am in Player\'s class.')
class Dealer(Player):
def print_cards(self):
print('I am in Dealer\'s class.')
def print_player(self):
super(Dealer, self).print_cards()
对于python 2和3, super
以不同的方式工作。特别注意def
类的Player
语句的区别:
class Player(object):
在Python2中被称为“新式”类。默认情况下,如果我没记错的话,Python 3中的所有类都是新式的类。另请注意,super
需要一种您正在寻找父类的类,以及一个self
,它是一个绑定对象,是父类的子类。
答案 1 :(得分:1)
您可以使用另一个self调用类的实例方法。 E.g:
class Player():
def print_cards(self):
print('I am in Player\'s class.')
class Dealer(Player):
def print_cards(self):
print('I am in Dealer\'s class.')
p = Player()
d = Dealer()
p.print_cards()
d.print_cards()
Player.print_cards(d) # Not an instance
输出:
I am in Player's class
I am in Dealer's class
I am in Player's class
在这种情况下,这不是很有用。另一个例子:
class Being:
def __init__(self):
self.saying = "Patience is a virtue."
self.home = "Earth"
def say_virtue(self):
print(self.saying)
def say_home(self):
print(self.home)
class Yoda:
def __init__(self):
self.saying = "Is patience virtue a."
self.home = "Far galaxy away far."
def say_virtue(self):
print("Mean you 'Virtue say'?")
yoda = Yoda()
being = Being()
being.say_virtue() # Says beings virtue
yoda.say_virtue() # Says yodas virtue
Being.say_virtue(yoda) # says Beings virtue with yodas `self.virtue`
# And as a side note:
print(yoda.say_home == being.say_home) # Instances
print(Yoda.say_home == Being.say_home) # Classes
## Prints:
Patience is a virtue.
Mean you 'Virtue say'?
Is patience virtue a.
False
True
答案 2 :(得分:1)
通常有人说可以使用super().method(self)
调用超类中的方法,这不完全是事实。
super
通常不是正确的做法,因为它不会调用超类中的方法,而是当前对象的类型方法解析顺序中的下一个类型的方法。 在多重继承的情况下,它可以调用您没有预料到的类中的方法:
class A(object):
def say(self):
print("I am A, just sayin'")
class B(A):
def say(self):
print("This is B, I let A speak for me")
super().say()
B.say()
来电A.say()
,对吧?
错了,因为我们还有:
class C(A):
def say(self):
print("Hey it is me C")
class D(B, C):
pass
现在我们创建一个D
的实例,并在其上调用say()
:
D().say()
输出结果为:
This is B, I let A speak for me
Hey it is me C
也就是说,super()
将B.say
的执行委托给C
完全不知道的B
类,而B
既不是C
子类或super()
的超类。 next_type
用词不当;它应该被称为super
或其他东西。因此,如果您知道要传递给哪个类,请不要使用class B(A):
def say(self):
print("This is B, I let A speak for me")
A.say(self)
,而是明确调用该方法:
{{1}}