1. 程式人生 > >面向對象—反射

面向對象—反射

ins pytho __main__ pan sub ole set person 內置函數

內置函數:
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

面向對象—反射