在父类和继承的类中,我都有确切的函数名称say_hello
。我想在Kitten类中指定参数name
,但允许用户在Cat类中指定参数。
是否可以避免在Kitten类的return ('Hello '+name)
函数中重复行say_hello
的需要?
当前:
class Cat:
def __init__(self):
pass
def say_hello(name):
return ('Hello '+name)
class Kitten(Cat):
def __init__(self):
super().__init__()
def say_hello(name='Thomas'):
return ('Hello '+name)
x = Cat
print (x.say_hello("Sally"))
y = Kitten
print (y.say_hello())
理想情况:
class Cat:
def __init__(self):
pass
def say_hello(name):
return ('Hello '+name)
class Kitten(Cat):
def __init__(self):
super().__init__()
def say_hello():
return super().say_hello(name='Thomas') # Something like this, so this portion of the code doesn't need to repeat completely
答案 0 :(得分:1)
say_hello
方法应包含self
作为第一个参数,以便它可以使用super()
函数来访问父级的say_hello
方法。您还应该通过用括号调用该类来实例化该类:
class Cat:
def say_hello(self, name):
return 'Hello ' + name
class Kitten(Cat):
def say_hello(self, name='Thomas'):
return super().say_hello(name)
x = Cat()
print(x.say_hello("Sally"))
y = Kitten()
print(y.say_hello())
这将输出:
Hello Sally
Hello Thomas
答案 1 :(得分:0)
我认为您可能会错过关于课程的知识,这对您想要实现的目标至关重要。
让我们首先定义一个类Cat
,但仔细研究一下与您的区别。
class Cat:
def __init__(self, name):
self.name = name
def say_hello(self):
return self.name
现在看魔术,我稍后再解释:
cat = Cat("Sally")
print(cat.say_hello())
>>> "Sally"
与您的代码相比,发生了什么?
首先,您的__init__
方法不带参数。我的版本是name
。此外,我将其分配给实例变量self.name
。
有了这个赋值,我就可以使用在每个方法中实例化时提供的名称,该方法的第一个参数为self
。什么是实例化?
在代码中,您叫x = Cat
。 x是该类的对象,而不是Instance。您需要实例化您的课程。
通过在我的代码cat = Cat("Sally")
中这样做,python所做的就是调用该类的__init__
方法,并按照__init__
方法中指定的所有设置/完成返回它的一个实例。
在我的情况下,我将self.name = name
设置为self.name
的值设为“ Sally”。
因此,每当我在方法中调用self.name
时,该方法在其参数中包含self
时,实例化后都会变成“ Sally”。
现在应该清除类Cat
。
现在该怎么办?
仅从此类继承!
请参阅:
class Cat:
def __init__(self, name):
self.name = name
def say_hello(self):
return self.name
class Kitten(Cat):
def __init__(self, name):
# This is done for convenience
super().__init__(name)
以此为例,与Cat实例相同,它有一个名称,并继承了say_hello()
方法,以说出它的名称。
我希望这会有所帮助。