1. 程式人生 > >反射和內置方法重寫

反射和內置方法重寫

iss 性別 range cnblogs ict 系列 sat sin set

isinstance和issubclass

isinstance(obj,cls)檢查是否obj是否是類 cls 的對象

class Foo(object):
     pass
  
obj = Foo()
  
sinstance(obj, Foo)

issubclass(sub, super)檢查sub類是否是 super 類的派生類

技術分享
class Foo(object):
    pass
 
class Bar(Foo):
    pass
 
issubclass(Bar, Foo)

反射

1 什麽是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。這一概念的提出很快引發了計算機科學領域關於應用反射性的研究。它首先被程序語言的設計領域所采用,並在Lisp和面向對象方面取得了成績。

四個反射函數

hasattr(obj,str)

檢測是否含有某屬性

getattr(obj,str)

獲取屬性,不存在報錯

setattr(obj,str,value)

設置屬性

delattr(obj,str)

刪除屬性,不存在報錯

導入其他模塊,利用反射查找該模塊是否存在某個方法
技術分享
def test():
    print(from the test)
View Code

item系列

__getitem__\__setitem__\__delitem__

技術分享
class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        self.__dict__[key]
=value def __delitem__(self, key): print(del obj[key]時,我執行) self.__dict__.pop(key) def __delattr__(self, item): print(del obj.key時,我執行) self.__dict__.pop(item) f1=Foo(sb) f1[age]=18 f1[age1]=19 del f1.age1 del f1[age] f1[name]=alex print(f1.__dict__)
View Code

__new__

技術分享
class A:
    def __init__(self):
        self.x = 1
        print(in init function)
    def __new__(cls, *args, **kwargs):
        print(in new function)
        return object.__new__(A, *args, **kwargs)

a = A()
print(a.x)
View Code 技術分享
class A:
    def __new__(cls):
        if not hasattr(cls,obj):
            cls.obj = object.__new__(cls)
        return cls.obj

a = A()
b = A()
print(a is b)
單例模式

__call__

對象後面加括號,觸發執行。

註:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對於 __call__ 方法的執行是由對象後加括號觸發的,即:對象() 或者 類()()

技術分享
class Foo:

    def __init__(self):
        pass
    
    def __call__(self, *args, **kwargs):

        print(__call__)


obj = Foo() # 執行 __init__
obj()       # 執行 __call__
View Code

__len__

技術分享
class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __len__(self):
        return len(self.__dict__)
a = A()
print(len(a)
View Code

__hash__

技術分享
class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __hash__(self):
        return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))
View Code

__eq__

技術分享
class A:
    def __init__(self):
        self.a = 1
        self.b = 2

    def __eq__(self,obj):
        if  self.a == obj.a and self.b == obj.b:
            return True
a = A()
b = A()
print(a == b)
View Code 技術分享
class Person:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def __hash__(self):
        return hash(self.name+self.sex)

    def __eq__(self, other):
        if self.name == other.name and self.sex == other.sex:return True


p_lst = []
for i in range(84):
    p_lst.append(Person(egon,i,male))

print(p_lst)
print(set(p_lst))
合並名字性別一樣的人

反射和內置方法重寫