Python 创建子类的实例时,也会创建其超类的实例,是否可以访问它?
我在python中学习了继承,python中非常清楚,一旦创建了子类的实例,相应的超类的实例也会被创建Python 创建子类的实例时,也会创建其超类的实例,是否可以访问它?,python,inheritance,Python,Inheritance,我在python中学习了继承,python中非常清楚,一旦创建了子类的实例,相应的超类的实例也会被创建 class Dog(): def __init__(self,breed,age,hasowner): print('Dog created') self.breed = breed self.age = age; self.hasowner = hasowner; specie = 'mammal' c
class Dog():
def __init__(self,breed,age,hasowner):
print('Dog created')
self.breed = breed
self.age = age;
self.hasowner = hasowner;
specie = 'mammal'
class Beagle(Dog):
def __init__(self):
Dog.__init__(self,'beagle',5,True)
print('beagle created')
my_beagle = Beagle()
正如预期的那样,当执行以下代码时,“Dog created”和“Beagle created”都打印在控制台上
所以我想知道如何访问创建的这个Dog对象?它不是这样工作的。未“同时”创建Dog的实例。有一个例子,那就是狗和小猎犬;因为小猎犬就是狗
继承的要点是,在Dog上定义的任何属性在Beagle上也可用(除非您覆盖它) 事实并非如此 创建一个实例,即同时创建一只
Beagle
和一只Dog
。对Beagle.\uuuu init\uuuu
中的Dog
类中的方法的调用也只是在Dog中运行代码-作为超类实例的子类必须提供要运行的祖先上的代码。(这通常是通过使用super()
而不是硬编码超类名来实现的)
此外,在静态类型语言中,通常可以将子类“强制转换”到它的一个超类中,这样就可以创建一个“Beagle”,将它强制转换为“Dog”,并直接调用结果对象上的“Dog”方法—Python中不是这样—通常不可能将对象“强制转换”到它的超类中。rahter,任何接受超类类型的对象的调用也将接受其任何子类的对象
super(…)
调用也可用于从类方法外部显式调用超类的方法或属性-因此,如果将类声明为:
class Dog():
定义初始(自我、品种、年龄、所有者):
打印('Dog created')
自我繁殖
self.age=年龄
self.hasowner=hasowner
def树皮(自身):
打印(“狗叫”)
物种=‘哺乳动物’
比格犬(狗)级:
定义初始化(自):
super().uuu init_uuuu('beagle',5,True)
打印('创建小猎犬')
def树皮(自身):
印刷品(“小猎犬树皮”)
我的小猎犬
可以这样做(粘贴上面的代码段后,从交互式控制台输出):
因此,您可以使用Dog的方法,但它不是一个单独的实例!
(还要注意,当在子类方法体之外使用时,
super()
要求显式给出类和实例参数)my_beagle
现在也是一个Dog
对象<代码>我的比格犬品种将存在并初始化。和super()。\uuuu init\uuuu('beagle',5,True)
是调用父类的initializer的python方法。值得一提的是,您可以使用super()
访问已在子类中重写的父类的属性。我还想知道:在我的代码中,Beagle的所有实例对于属性Bread age和hasowner是否共享相同的值?因此,这在某种程度上模拟了类对象属性的行为?没有breed
,age
和hasowner
是实例属性,因此它们不被共享-它们是使用例如self.breed
访问的<代码>种类是类属性。
In [147]: my_beagle.bark()
beagle bark
In [148]: super(Beagle, my_beagle).bark()
dog bark