23、组合、多态、反射、以及内置函数
一、组合
组合,就是一个对象拥有一个属性,这属性的值是另外一个对象,这样就能调用另外一个对象的功能
class Foo:
def __init__(self, x, y):
self.x = x
self.y = y
def func1(self):
print('Foo的func1')
class Bar:
def __init__(self, m, n):
self.m = m
self.n = n
def func2(self):
print('Bar的func2')
obj1 = Foo(100,200) # 造出对象obj1
obj2 = Bar(1111,2222) # 造出对象obj2
obj2.x = obj1 # obj2的x等于obj1(组合)
obj2.x.func1() # 运行结果:Foo的func1
二、多态
同一种事物有多种形态,比如说水可以是水、也可以冰或者水蒸气。
又比如说,无论是猪还是狗,它们都属于动物,所以猪和狗都是动物的多种形态
多态是一种理论知识,就是继承的一种 特性
class Animal:
def spekak(self):
pass
class pig(Animal):
pass
class Dog(Animal):
pass
obj1 = Pig()
obj2 = Dog()
多态性
我们可以在不用知道对象具体类型的前提下,而直接使用对象。
所以学了多态,我们发现我们并没有增加什么知识点,我们其实一直再使用多态,只是我们不知道...
鸭子类型
鸭子类型就是不依赖继承实现多态的方式,比如说有一只鸭子会叫,会跑,现在有一只狗也和鸭子一样会跑会叫,那这只狗也相当于是只鸭子啦。鸭子类似就是统一类的属性方法,只要他们的属性方法一样,就不需要继承了。代码也清晰了不少
三、反射
通过字符串来操作属性
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def func(self):
print('==>', self.name, self.age)
obj1 = People("poco", 18)
# hasattr判断属性是否存在
print(hasattr(obj1, 'name')) # True
# getattr拿到属性,还可以拿到函数的内存地址
print(getattr(obj1, 'name')) # poco
getattr(obj1, "func")() # ==> poco 18
# setattr给对象增加属性
setattr(obj1, "gender", "male")
print(obj1.__dict__) # {'name': 'poco', 'age': 18, 'gender': 'male'}
# delattr删除对象的一个属性
delattr(obj1, "age")
print(obj1.__dict__) # {'name': 'poco'}
四、内置函数
1、 _str_
__str__方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return '<Name:%s Age:%s>' % (self.name, self.age) # 返回类型必须是字符串
p = People('lili', 18)
print(p)
2、issubclass与isinstance
class Foo(object):
pass
class Bar(Foo):
pass
print(issubclass(Bar, Foo)) # 检查Bar类是否是 Foo 类的子类
class Foo(object):
pass
obj = Foo()
print(isinstance(obj, Foo)) # 检查obj是否是Foo的对象

浙公网安备 33010602011771号