廖雪峰python学习笔记【13】面向对象高级编程:多重继承、定制类、枚举类、元类

一、多重继承

1. Java是单一继承,Python是多重继承。

2. 多重继承的好处是避免了复杂庞大的继承链。

3. 多重继承时,提供基本功能的父类作为继承的第一个类,其他类名最好以MinIn结尾,体现出继承关系。

二、定制类

1.__len__方法:类中实现__len__方法后,类的实例能够通过len()函数获取实例的长度(即__len__方法的返回值)。

2. __str__方法:类中实现__str__方法后,类的实例能够通过print()函数打印出实例的内容(即__str__方法的返回值)。

3. __repr__方法:类中实现__repr__方法后,在交互式命令行输入实例名后,能打印出实例的内容(即__repr__方法的返回值)。

4. 类中实现__iter__和__next__方法后,类的实例能够作用于for var in obj循环。每次循环调用实例obj中的__next__方法。

5. __getitem__方法:实现__getitem__方法后能够使用下标访问类的实例。

6. __getattr__方法:实现__getattr__方法后,访问实例中不存在的属性时,会调用__getattr__方法。

7. __call__方法:通常访问实例方法是类似obj.method()的方式调用。实现__call__方法后,可以通过obj()直接调用__call__方法。

8. 普通函数和实现了__call__方法的类实例,作为callable()函数的参数时,函数返回True。

三、使用枚举类

1. 通过python提供的Enum类,定义常量

from enum import Enum # 从enum.py模块导入Enum类。
weekDay = Enum("WeekDay", ("Mon", "Tue", "Wed", "Thur", "Fri", "Sat", "Sun"))
# weekDay是类的别名;
# WeekDay是类名,该类是继承自Enum类。

2. 访问枚举的方法:

weekDay.Sun #输出WeekDay.Sun
weekDay['Sun'] #输出WeekDay.Sun
weekDay.Sun.value #输出7. 枚举值默认从0开始。
weekDay.(7) #输出WeekDay.Sun

3. 为了方便控制枚举常量的值,可以自己定义枚举类:

from enum import Enum, unique
@unique #@unique装饰器 帮助检查保证没有重复值。
class WeekDay(Enum):
    Sun = 0
    Mon = 1
    Tue = 2
    Wed = 3
    Thur = 4
    Fri = 5
    Sat = 6

四、使用元类

1. type()

    1.1 动态语言的函数和类的定义,不是在编译时确定的,而是在运行时动态创建的。

    1.2 使用type()可以获得类型或变量的类型。类型的类型是type,比如int, list,自定义类等的类型是type。

    1.3 type()函数也可以动态创建自定义类。事实上python解释器读取python源码时,遇到class的定义,仅仅是扫描一下class定义的语法,然后通过type()函数创建出class。

Hello = type('helloClass', (object, ), dict(method=func)) # 说明如下:
    Hello : 是type()函数定义的类的别名。
    helloClass : 是type()函数定义的类名。
    (object, ) : 元祖中的object说明helloClass类继承自object。
    dict(method=func) : func为自定义的函数,表示将func函数作为helloClass的方法method。

2. metaclass

    2.1 略。

猜你喜欢

转载自blog.csdn.net/liufuchun111/article/details/80579612