面向对象—反射

内置函数:
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

 

posted @ 2018-04-25 22:01  GYuan  阅读(168)  评论(0编辑  收藏  举报