反射和内置方法重写

Posted —super—

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反射和内置方法重写相关的知识,希望对你有一定的参考价值。

 

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))
合并名字性别一样的人

 



以上是关于反射和内置方法重写的主要内容,如果未能解决你的问题,请参考以下文章

Day17-注解与反射

java_注解与反射

注解与反射

注解与反射

issubclass和isinstance,反射,内置方法

python面对对象(反射,内置方法)