类=属性+方法
python 定义类:
创建对象: tt = Turtle()
tt.climb() tt.bite()
python 是面向对象编程的语言。
面向对象特征:封装,继承,多态。
python 中的 self 相当于C++ 中的this 指针
eg:
a = Ball() a.setName("AA")
b = Ball() b.setName("BB")
a.kick() b.kick()
python 对象的构造方法,_init_(self,param1,param1),会在实例化对象时自动调用。
如果定义了_init_()方法,如果有参,那么在创建对象实例时必须传入参数。
共有属性,私有属性。 在属性前加两个下划线变成私有。
共有:
私有:
1)可以通过方法去访问私有属性
2)可以通过p._Person__name访问私有属性,可见python 不是具有完全私有属性的。
类:继承
class 子类(父类):
1.如果子类中存在父类同名方法,子类调用方法会覆盖父类中的方法。
如果子类中重写了构造方法,需要在构造方法中使用super() 方法来调用父类构造方法,才能使用父类中的属性。
多重继承
类:组合
类定义,类对象,实例对象。
优先级:逐渐增高,实例对象的属性 会覆盖类对象的属性 会覆盖类定义的属性。
如果类中属性与方法同名,那么属性会覆盖方法
所以,python 定义类的一些规定:
1.不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来扩展。
2.用不同的词性命名,如属性名用名词,方法名用动词。
python 绑定:
python 要求方法需要有实例才能被调用,这种限制其实就是python 所谓的绑定概念。
类相关的BIF
issubclass(A,B); A 是否B的子类
isintance(object,classinfo); object是否是class的实例; classinfo可以是一个元组(A类,B类,C类)
如果第一个参数不是对象,则永远返回false.
hasattr(object,name) 判断对象是否有对应的属性
getattr(object,name[,default]) 获取对象对应的属性。
setattr(object,name,value) 给对象某属性赋值。
delattr(object,name) 删除对象的某属性。
property(fget=None,fset=None,fdel=None,doc=None),获取类方法的值,我们可以
python 魔法方法
魔法方法总是被双下划线包围,例如__init__;魔法方法是面向对象的python 的一切。魔法方法体现它们总能够在适当的时候被自动调用。
构造函数__init__(self,...)
当我们继承不可变类型时,又需要进行修改的时候,魔法方法就变得很重要了。
__new__(class,...)
__del__(self)
当没有变量引用某对象时,就会调用python的垃圾回收机制,回收对象时就会调用对象的__del__().
魔法方法:算术运算
python 属性访问魔法方法
python 描述符
描述符:将某种特殊类型的类的实例指派给另一个类的属性。
使用描述符 自定义实现property类
python 定制序列
如果要定义某类型,就需要重写该类型的对应的魔法方法。
例如:编写不可变自定义列表,记录列表中每个元素被访问的次数。
python 迭代器
使用for 循环迭代,for 循环实际就是自动调用迭代方法。
关于迭代的两个BIF
iter(); next();
iter() 对应的魔法方法:__iter__(); __next__()对应的魔法方法 __next__();
python 生成器 使用yield 关键字,生成器实际是特殊的迭代器
所谓的协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。
python模块
导入模块: 1. import 模块名 2. from 模块名 import 函数名。 3 import 模块名 as 新名字。
第一种以及第三种调用函数 :需使用模块名. 函数名。
需要把包路径 append 到sys.path 中。