day23元類、反射

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()

相關文章
相關標籤/搜索