1、補充spa
isinstance 檢查是否obj、是不是類 cls 的對象code
issubclass檢查sub類是不是 super 類的派生類對象
2、反射弧ip
經過字符串來操做類與對象的屬性,這種操做稱爲反射文檔
hasatter 判斷object中有沒有一個name字符串對應的方法或屬性字符串
getatter 獲取obj中有沒有一個name 字符串若是沒有的話就返回一個 noneget
setatter給 obj 中的一個屬性添加一個值input
delatter刪除obj中的一個屬性cmd
class People:it
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()
3、__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)
4、__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)
5、元類
一、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 定義的類使用來產生咱們本身的對象的
一、內置元類type是用來專門產生class定義的類的
二、用內置的元類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)
三、儲備知識__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)
四、自定義元類:
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={}
一、造一個空對象
obj=object.__new__(self)
二、調用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()