一、补充
isinstance 检查是否obj、是否是类 cls 的对象
issubclass检查sub类是否是 super 类的派生类
二、反射弧
通过字符串来操作类与对象的属性,这种操作称为反射
hasatter 判断object中有没有一个name字符串对应的方法或属性
getatter 获取obj中有没有一个name 字符串如果没有的话就返回一个 none
setatter给 obj 中的一个属性添加一个值
delatter删除obj中的一个属性
class People:
def __init__(self,name,age):
self.name=name
self.age=age
obj=People('aa',10)
print(hasatter(People,'name'))
print(getattr(obj,'name'))
setatter(People,'name','bb')
print(People.__dict__)
print(People,'age')
print(obj.__dict__)
输入运行命令执行该命令
class Foo:
def run(self):
while True:
cmd=input('cmd>>:').strip()
if hasattr(self,cmd):
func=getattr(self,cmd)
func()
def download(slelf):
print('download.....')
def upload(self):
print('upload...')
obj=Foo()
obj.run()
三、__str__
class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def __str__(self):
return(‘名字:%s 年龄:%s 性别:%s’)%(self.name,self.age,self.sex)
obj=People('egon',18,'male')
print(obj)
四、__del__
import time
class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def __del__(self):#在对象被删除的条件下,自动执行
print('__del__')
obj=People('egon',18,'male')
del obj
time.sleep(5)
五、元类
1、exce用法
code='''
x=1
y=2
def f1(self,a,b):
pass
'''
local_dic={}
exec(code,{},local_dic)
一切皆为对象:
chinese=type(...)
class chinese:
country='china'
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def speak(self):
print('%s speak chinese'%self.name)
print(chinese)
p=chinese('egon',18,'male')
print(type(p))
元类:类的类就是元类,
我们用class 定义的类使用来产生我们自己的对象的
1、内置元类type是用来专门产生class定义的类的
2、用内置的元类type,来实例化得到我们的类
class_name='chinese'
class_bases=(object,)
class_body='''
country='China'
def __init__(self,name,age,sex)
self.name=name
self.age=age
self.sex=sex
def speak(self):
print('%s speak Chinese'%self.name)
'''
class_dic={}
exec(class_body,{},class_dic)
类的三大要素,类名,空对象,类体
print(class_name,class_bases,class_dic)
Chinese=type(class_name,class_bases,class_dic)
3、储备知识__call__
class Foo:
def __init__(self):
pass
def __str__(self):
return'123'
def __del__(self):
pass
调用对象,则会自动触发对象下的绑定方法__call__的执行,
然后将对象本身当作第一个参数传给self,将调用对象括号内的值
传给*args**kwargs
def __del__(self):
pass
obj=Foo()
print(obj)
4、自定义元类:
class Mymeta(type):
#来控制类Foo的创建
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError('类名的首字母必须大写')
if not class_dic.get('__doc__'):
raise TypeError('类中必须写好文档注释')
super(Mymeta,self).__init__(class_name,class_bases,class_dic)
#控制类Foo的调用过程,即控制实例化Foo的过程
def__call__(self,*args,**kwargs):#self=Foo,args=(111,)kwargs={}
1、造一个空对象
obj=object.__new__(self)
2、调用Foo.__init__,将连同调用Foo括号内的参数一同传给__init__
self.__init__(obj,*args,**kwargs)
return obj
#Foo=Mymeta('Foo',(object),class_dic)
class Foo(object,metaclass=Mymeta):
'''
文档注释
‘’‘
x=1
def __init__(self,y):
self.Y=y
def f1(self):
print('from f1')
obj=Foo(111)
#单例模式
import settings
class MySQL:
_instance=None
def __init__(self,ip,port):
self.ip=ip
self.port=port
@classmethod
def singleto(cls):
if not cls._instance:
obj=cls(settings.IP,settings.PORT)
cls._instance=obj
return cls._instance
obj4=MySQL.singleton()
obj5=MySQL.singleton()