python面向对象
封装
构造函数__init__(),所有方法要传入self。
类变量。使用方法:类名.类变量。
实例变量。写在__init__()的body里。也可以在实例化后增加。对于简单类型,这样做,在别的实例是没有这个变量的,也不会覆盖类变量,是实例的自有的变量。实例在.变量时,先用自己的,若没有则找类变量。对于集合等,实例在.变量时,则看是赋值还是追加(例如append),赋值会创建新的自有变量,追加得提前在类中定义该变量。
析构函数,在实例销毁时执行的收尾工作。比如关闭文件、数据库等。def __def__(self):
私有属性/方法:前面加上__,后面不用加。
继承
class Man(People):
子类的方法里调用父类方法:用父类名.父类方法。例如:People/Man里
def __init__(self,name,age,money):
People.__init__(self,name,age)
self.money = money
也可以用“新式类”格式这样:
def __init__(self,name,age,money):
super(Man,self).__init__(self,name,age)
self.money = money
python可以多继承,所以后者更方便。
多继承:
class Man(Peole,Relation): 构造函数,按继承顺序执行。2.0版本经典类用的深度优先,新式类用广度优先,3.0用的都是广度优先。
新式类:
class People(object):
写程序要安新式方式写。
静态方法:@staticmethod装饰的类方法。实际上跟类没有关系。名义上归类管,但不能访问类或实例中的任何成员。比如os模块。
类方法:@classmethod装饰的类方法。只能访问类变量,不能访问实例变量。
属性方法:@property装饰的类方法。调用不加括号。把一个方法变成一个静态属性。再写一个同名方法,并用@同名方法.setter装饰。放在前者下面。外面调用时,用=传参数。
普通属性,可以用del删除。但是属性方法得用特殊方式删除。可以@同名方法.deleter删除。
obj.__module__输出模块
obj.__class__输出类
def __call__(self,*args,**kwargs),可以把类的实例用()调用。
__dict__查看类中所有成员Dog.__dict__,不包括实例属性 d.__dict__,查看实例所有属性,不包括类属性。
__str__字符串化,类似java的toString()
__getitem __setitem __delitem 让实例像字典一样赋值。
__new__\__metaclass__ 一个类是type类的一个实例,是通过type类的构造方法创建
def func(self):
print('hello %s' %self.name)
def __init__(self,name):
self.name = name
Foo = type('Foo',(object,),{'talk':func,'__init__':__init__})
f = Foo("roger")
f.talk()
print(type(Foo))
type是类的类。
__new__ 在__init__之前执行。new是用来创建实例的,new里调用了init。call里调用了new。
__metaclass__ 用来定义这个类以怎样形式被创建