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的对象
posted @ 2021-04-17 15:41  黑影Poco  阅读(53)  评论(0)    收藏  举报