类的内置方法
类的双下划线方法:
__len__
#-*- coding:utf-8 -*- class Length(object): def __init__(self): print("xixi") def __len__(self): print("length is 180 cm") return 1 l = Length() len(l)
必须会的双下线方法:
__Str__ & __repr__
Str函数或者print函数调用是 str
Repr 或者在终端中使用是使用的就是repr
如果没有定义str,那么repr会出来代替输出
这两个方法返回值必须是字符串,否则抛出异常
class School(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __repr__(self): return 'repr' def __str__(self): return 'str' s1 = School('xdd',22,'Man') print(repr(s1)) print(str(s1)) print(s1)
__del__ 析构方法 和__init__恰恰相反,init为程序启动时,执行,del为程序关闭时,执行.
class School(object): def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex def __del__(self): print("process dead") s = School('jack',22,'W') print('aa') print('vv')
NEW方法
__new__ 方法在 __init__ 方法之前执行
# -*- coding:utf-8 -*- class Printer(object): tasks = [] # 存储打印任务的列表 instance = None def __init__(self,name): self.name = name def add_task(self,job): self.tasks.append(job) print("[%s]添加了[%s]到hp打印机,目前任务数量[%s]"%(self.name,job,len(self.tasks))) def __new__(cls, *args, **kwargs): #只有第一次实例化的时候进行,后边的实例化不会再次创建一个新实例 if cls.instance is None:# 进行正常的实例化,并把实例化后的对象,存在cls,instance里 obj = object.__new__(cls)#实例化过程 print("obj",obj) cls.instance = obj #把实例化好的对象存下来 return cls.instance #以后的每次实例化都会返回第一次存在的实例对象 p1 = Printer("word") p2 = Printer("pdf") p3 = Printer("execl") p1.add_task("word data") p2.add_task("pdf data") p3.add_task("execl data")
Call方法:__call__ 对象后边加括号触发执行
加上了call方法后
S = School()
S() 这样才会执行
或者使用 School()() 才能执行
例子:
>>> p = Person('Bob', 'male')
>>> p('Tim')
My name is Bob...
My friend is Tim...
单看 p('Tim') 你无法确定 p 是一个函数还是一个类实例,所以,在Python中,函数也是对象,对象和函数的区别并不显著。
Type动态生成一个类
# -*- coding:utf-8 -*- class Person(object): def __init__(self, name): self.name = name p = Person('Alex') print(type(p)) print(type(Person)) def __init__(self,name,age): self.name = name self.age = age Class_D = type("Person_Bak",(object,),{'sex':'W',"__init__":__init__}) #通过type动态产生一个类 print(Class_D) d = Class_D('jack',22) print(d.sex,d.age,d.name) print(Class_D)
Isinstance(obj,cls)
检查obj是否是类cls的对象
class Foo(object):
Pass
obj = Foo()
isinstance(obj,Foo)
Issubclass(sub,super)
检查sub类是否是super类的派生类
class Foo(object):
pass
class Bar(object):
pass
issubclass(Bar,Foo)