面向對象高級小結

1、面向對象高級小結

1.1 isinstance,issubclass

isinstance判斷是否爲類的實例化對象,會檢測父類,而type不會檢測父類app

issubclass,判斷是否爲其子類code

1.2 反射

  1. hasattr:經過字符串判斷是否類屬性存在
  2. getattr:經過字符串獲取類屬性
  3. setattr:經過字符串修改類屬性
  4. delattr:經過字符串刪除類屬性

1.3 call

class Foo:
    def __init__(self):
        print('Foo()會觸發我')
    def __call__(self):
        print('Foo()()/f()會觸發我')

f = Foo()
f()

1.4 new

class Foo:
    def __new__(self):
        print('new')
        obj = object.__new__(self)
        return obj
    
    def __init__(self):
        print('init')
        
f = Foo()

1.5 元類

元類用來造類的對象

元類()-->類-->init字符串

元類()()-->對象--->callget

類分爲幾部分:類名/類體名稱空間/父類們it

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):
        # 控制類的邏輯代碼
        super().__init__(class_name,class_bases,class_dic)
    
    def __call__(self,*args,**kwargs):
        # 控制類實例化的參數
        
        obj = self.__new__(self)  # obj就是實例化的對象
        self.__init__(obj,*args,**kwargs)
        print(obj.__dict__)
        
        # 控制類實例化的邏輯
        
        return obj
    
class People(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age

2、單例模式

2.0.1 利用類的綁定方法的特性

NAME = 'nick'
AGE = 18

class People():
    
    __instance = None
    
    @classmethod
    def from_conf(cls):
        if cls.__instance:
            return cls.__instance
        
        cls.__instance = cls(NAME,AGE)
        return cls.__instance

People.from_conf()class

People.from_conf()object

2.0.2 利用裝飾器

NAME = 'nick'
AGE = 18

def deco(cls):
    cls.__instance = cls(NAME,AGE)
    
    def wrapper(*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return cls.__instance
        
        res = cls(*args,**kwargs)
        return res
    
    return wrapper

@deco
class People():
    def __init__(self,name,age):
        self.name = name
        self.age = age

peo1 = People()meta

peo2 = People()

2.0.3 利用元類(正宗的)

NAME = 'nick'
AGE = 18

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dict):
        super().__init__(class_name,class_bases,class_dict)
        self.__instance = self(NAME,AGE)
     
    def __call__(self,*args,**kwargs):
        
        if len(args) == 0 and len(kwargs) == 0:
            return self.__instance
        
        obj = object.__new__(self)
        self.__init__(obj,*args,**kwargs)
        
        return obj
    
class People(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
peo1 = People()
peo2 = People()
相關文章
相關標籤/搜索