class A():
def bar(self):
print("bar")
#这里面的self相当于c,也就是从D 开始重新找
self.f1()
class B(A):
def f1(self):
print("b")
class C():
def f1(self):
print("c")
class D(C,B):
pass
c=D()
c.bar()
》》》
bar
c
c调用父类的构造方法
class Animal():
def __init__(self):
self.ti = "动物"
print("1")
class Cat(Animal):
def __init__(self):
self.a="猫"
print(2)
#将对象c根据self导入Animal
super(Cat, self).__init__()
#Animal.__init__(self)
c=Cat()
++++++++++++++反射++++++++++++++++++++++
class Foo():
def __init__(self,name):
self.name = name
def show(self):
print("show")
obj = Foo('alex')
#反射:类,只能找类里面的成员(__init__,show)
#以字符串的形式
r = hasattr(Foo,"name")
print(r)
#反射:对象,全能
#以字符串的形式
r = hasattr(obj,"name")
print(r)
》》》
False
True
从上面可以看出来。利用反射,当反射的条件是类的时候只能返回类里面的方法,当用对象的时候返回的是属性加方法
二
上面的文件的包名叫做__init__ ,引出下面的例子
#导入文件
m = __import__("__init__",fromlist=True)
#导入类
class_name = getattr(m,'Foo')
#得到对象
obj=class_name("Aexl")
#得到对象属性
val = getattr(obj,"name")
#打印
print(val)
》>>
Aexl