设为首页 加入收藏

TOP

面向对象高级小结
2019-07-02 14:17:30 】 浏览:30
Tags:面向 对象 高级 小结

面向对象高级小结

isinstance,issubclass

isinstance判断是否为类的实例化对象,会检测父类,而type不会检测父类

issubclass,判断是否为其子类

反射

  1. hasattr:通过字符串判断是否类属性存在
  2. getattr:通过字符串获取类属性
  3. setattr:通过字符串修改类属性
  4. delattr:通过字符串删除类属性

call

class Foo:
    def __init__(self):
        print('Foo()会触发我')
    def __call__(self):
        print('Foo()()/f()会触发我')

f = Foo()
f()

new

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

元类

元类用来造类的

元类()-->类-->init

元类()()-->对象--->call

类分为几部分:类名/类体名称空间/父类们

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

单例模式

利用类的绑定方法的特性

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

People.from_conf()

利用装饰器

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

peo2 = People()

利用元类(正宗的)

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()
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇计算机基础与python安装 下一篇python算法与数据结构-常用查找算..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目