class A(object):
def __init__(self):
self.name = 'leel'
def test(self):
print('A test')
class B(A):
def __init__(self):
super(B, self).__init__()
self.name = 'conan'
if __name__ == '__main__':
b = B()
b.test()
print(b.name)
结果如下:
A test
conan
子类调用父类是很常见的用法,上面的例子就是简单的继承关系,子类B实例化后调用父类A中的方法,但是需要注意的是,当子类中有的属性会覆盖父类的属性。
class A(object):
def __init__(self):
self.name = 'leel'
def printf_1(self):
method = eval('self.' + 'ok')
print method #这里也可以直接self.ok
self.test()
return self.name
def test(self):
print('A test')
class B(A):
def __init__(self):
# A.__init__(self)
super(B, self).__init__()
self.name = 'conan'
def printf(self):
print self.printf_1()
def test(self):
print('B test')
@property
def ok(self):
return ('morilan')
if __name__ == '__main__':
b = B()
b.printf()
print(b.name)
结果如下
morilan
B test
conan
conan
同样,如果想要父类实现调用子类的方法或属性,同样需要对子类B进行实例化(如果只对父类A实例化,无法实现子类调用),流程是实例b调用自身的方法printf(),然后去调用父类A中的方法printf_1(),其中method实际上就是父类A去获取B类的属性ok,本质上还是实例b的自我调用,因此输出morilan,接着执行self.test()方法,因为子类B中已有的方法,会直接调用实例b的自己的方法,所以会返回B test,最后同理,也会输出实例b的name属性conan。