面向对象—反射

Posted 郭圆

tags:

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

内置函数:
1.isinstance:判断一个对象和一个类有没有血缘关系
class A:pass
class B(A):pass
a = B()
print(isinstance(a,B)) #True
print(isinstance(a,A)) #True
print(type(a) is B) #True
print(type(a) is A) #False
2.issubclass(子类名,父类名):检测继承关系,返回True说明与继承关系
class A:pass
class B(A):pass
class C(B):pass
print(issubclass(C,B))#True
print(issubclass(C,A))#True

 反射

反射:通过字符串的形式操作对象相关的属性,使用字符串数据类型的变量名访问一个命名空间中的名字,找一个属性直接就可以找到这个属性的值,找一个方法找到的是这个方法的内存地址。

反射的4个内置函数:

1.hasatter:判断一个命名空间里是否有一个属性或方法

class A:
    role = Person
    def func(self):
        print(**self)

print(hasattr(A,r)) # False
print(hasattr(A,role)) # True
print(hasattr(A,func)) # True
ret = input(>>>)
if hasattr(A,ret):
    print(getattr(A,ret))
if hasattr(A,ret):
    func = getattr(A,ret)
    func(12)
2.getatter:从一个命名空间里获取一个属性或方法的值,方法需要调用。
class A:
    role = Person
    def func(self):
        print(**self)
ret = input(>>>)
print(getattr(A,role)) #从A的命名空间里找一个属性,直接可以找到这个属性的值
f = getattr(A,func);f(3) #从A的命名空间里找一个方法,找到的是这个方法的内存地址
A.func(1)
  • 类使用类命名空间中的名字:getattr(类名,‘名字‘)
  • 对象使用对象能用的方法和属性:getattr(对象名,‘名字‘)
  • class A:
        role = Person
        def __init__(self):
            self.money = 500
        def func(self):
            print(**5)
    a = A()
    getattr(a,func)()
    print(getattr(a,money)) #getattr(对象名,‘名字‘)
  • 模块使用模块中的名字:getattr(模块名,‘名字‘)
  • import time
    time.time()
    print(time.time)
    print(getattr(time,time))
    
    import os
    getattr(os,rename)(user,user_info)
  • 自己所在的模块中使用自己的名字:impoart sys    getattr(sys.modules[‘__main__‘],名字)
  • def login():
        print(执行login功能)
    def register():
        print(执行register功能)
    
    import sys #和python解释器相关的内容都在sys模块里
    print(sys.modules[__main__]) # 找到自己所在的模块(py文件)
    func = input(>>>)
    getattr(sys.modules[__main__],func)()

 3.setatter:增加和修改

 4.delatter:删除

class A:
    def __init__(self,name):
        self.name = name
    def wahaha(self):
        print(wahahaha)

a = A(alex)
# a.age = 18
# print(a.__dict__)
setattr(a,age,18) # 增加一个属性
print(a.__dict__) # {‘age‘: 18, ‘name‘: ‘alex‘}
setattr(a,name,taibao) # 修改一个属性
print(a.__dict__)# {‘age‘: 18, ‘name‘: ‘taibao‘}
delattr(a,age) #删除一个属性
print(a.__dict__) #{‘name‘: ‘taibao‘}

 内置方法

len()内置方法和内置函数__len__是对应的关系

class A:
    def __init__(self,name,age,sex,cls):
        self.name = name
        self.age = age
        self.sex = sex
        self.cls = cls
    def __len__(self):
        return len(self.__dict__)

a = A(alex,18,man,2)
print(len(a)) # 4
a.hobby = 烫头
print(len(a)) # 5

hash()内置方法和内置函数__hash__是对应的关系

class A:
    def __init__(self,name,age,sex,cls):
        self.name = name
        self.age = age
        self.sex = sex
        self.cls = cls
    def __hash__(self):
        return 1
a = A(alex,18,man,2)
print(hash(a)) # 1

 

以上是关于面向对象—反射的主要内容,如果未能解决你的问题,请参考以下文章

面向对象--反射

Python面向对象 | 反射

Python面向对象反射,双下方法

python面向对象的反射

Python面向对象之反射,双下方法

面向对象 反射 特殊方法