廖雪峰Python 类
廖雪峰Python 类
智汇君廖雪峰Python 类
类
init方法
1 | 虽然实例属性可以后期动态添加,但是也可以通过__init__初始化方法绑定成员变量。self参数表示指向创建的实例 |
访问限制
1 | 成员变量前面加上两个下划线,变成私有属性:外部无法通过 .__属性 访问。 |
继承和多态
1 | class Animal(object): |
1 | 重写父类方法 |
1 | java中:继承后重写父类方法要加上@override |
1 | 多态的好处从下面就可以看出:无需确切地知道它的子类型,就可以放心地调用run()方法 |
获取对象信息
type isinstance dir()
1 | type() |
–len–()
1 | __len__() 一个对象能够使用len()都是因为它的内部实现了__len__()方法 |
1 | 类似__xxx__的属性和方法在Python中都是有特殊用途的 |
hasattr setattr getattr()
1 | >>> class MyObject(object): |
1 | >>> hasattr(obj, 'x') # 有属性'x'吗? |
1 | >>> hasattr(obj, 'power') # 有方法'power'吗? |
实例属性和类属性
1 | 可以在创建实例时通过init方法,给实例添加实例属性,也可以在实例创建之后同过动态方式添加属性 |
1 | class Student(object): |
1 | 类属性 |
1 | >>> class Student(object): |
动态添加方法和属性
实例
1 | 可以给类实例动态增加属性和方法 |
1 | class Student(): |
1 | def set_age(self, age): # 定义一个函数作为实例方法 |
类
1 | >>> def set_score(self, score): |
面向对象高级编程
使用–slots–
1 | __slots__用于限定给实例动态添加的属性类型 |
1 | class Student(object): |
@property
1 | 略 |
多重继承
1 | class Animal(object): |
1 | 现在,我们要给动物再加上Runnable和Flyable的功能,只需要先定义好Runnable和Flyable的类 |
1 | class Dog(Mammal, Runnable): |
定制类
–str()–
1 | __str__()和java里toString()方法一样的功能,让print能够打印一个变量 |
–repr–()
1 | __repr__()和__str()__类似,前者在命令行输入变量回车时会用,后者print变量时会用 |
1 | 解决办法是再定义一个__repr__()。但是通常__str__()和__repr__()代码都是一样的,所以,有个偷懒的写法: |
–iter–()、–next–()
1 | 类似于java如果一个对象想能够用for each循环,则要实现iterable接口完成iterator()方法 |
斐波那契
1 | class Fib(object): |
–getitem–()、–setitem–()、–delitem–()
1 | __getitem__()是对象可以通过索引取值,和能够使用切片机制 |
–getattr–()
1 | 用于解决调用某个属性时不存在的问题 |
1 | class Student(object): |
1 | class Student(object): |
–call–()、callable()
1 | 任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用 |
1 | >>> s = Student('Michael') |
1 | 那么,怎么判断一个变量是对象还是函数呢?其实,更多的时候,我们需要判断一个对象是否能被调用,能被调用的对象就是一个Callable对象,比如函数和我们上面定义的带有__call__()的类实例 |
1 | 通过callable()函数,我们就可以判断一个对象是否是“可调用”对象。 |
枚举类
1 | from enum import Enum |
元类
1 | type()可以用来在运行期间动态创建类 |









