反射2

一:isinstance和issubclasspython

# 對象與類之間的關係
#     判斷第一個參數是不是第二個參數的實例
# 身份運算
2 == 3   # 值是否相等
2 is 3   # 內存地址是否相等
class A:pass
class B(A):pass
class C(B):pass
c = C()
print(isinstance(c,A))   # 包含繼承關係的判斷
print(type(b) is B)      * 會報錯   type只關心建立這個對象的類
print(type(b) is A)      # 只關心建立這個對象的類t* 會報錯

# 類與類之間的關係
issubclass()
class A:pass
class B(A):pass
print(issubclass(A,B))
print(issubclass(B,A))
# 第一個參數是疑似子類,第二個參數是疑似父類.
# 最終結果若是真的是父子類關係,則返回True

 

二:反射編程

# 反射的定義 : 經過字符串 來 操做python代碼中的 變量 函數 甚至類和方法
# class A:
#     name = 'alex'   # 靜態 屬性
#     age = 83        # 靜態 屬性

# hasattr getattr
# print(getattr(A,'name'))  無實例化,就用類名,Python類也是一個對象
# print(hasattr(A,'name'))

# 在類中使用 類中獲取類的靜態屬性
# tag = input('>>>')
# if hasattr(A,tag):
#     print(getattr(A,tag))
# 屬性的值 = getattr(類名,字符串數據類型的屬性名)
# 若是第二個參數是不存在的屬性名,則會報錯
#
class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def show(self):
        for key in self.__dict__:
            print(key,self.__dict__[key])

yuan = Student('苑昊',38)
# yuan.show()
# 'show'
if hasattr(yuan,'name'):
    print(getattr(yuan,'name'))
if hasattr(yuan,'show'):
    func = getattr(yuan,'show')
    func()

打印結果:sass

苑昊
name 苑昊
age 38網絡

 

 

反射2:函數

hasassr getattr
類.靜態屬性   getattr(類,'靜態屬性')
對象.方法
  getattr(對象,'方法')()   直接反射獲得一個方法以後調用
對象.對象屬性

應用場景 : 網絡編程 從文件中讀取信息反映到編程中

setattr delattr

class Student:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def show(self):
        for key in self.__dict__:
            print(key,self.__dict__[key])

hei = Student('小黑',18)
hei.sex = '不詳'
print(hei.sex)
setattr(hei,'sex','不詳')  # 增改操做
print(hei.sex)
setattr(hei,'sex','male')
print(hei.sex)
delattr(hei,'sex')    # 刪除操做
print(hei.__dict__)
def wahaha(a,b):   # 專屬於某一個對象的靜態方法
    print(a,b)

setattr(hei,'func',wahaha)  #這樣寫有問題
print(hei.__dict__)
hei.func(1,2)

hasattr  判斷某一個 變量 是否可以.調用一個名字,返回True或者False
getattr  直接獲取一個變量中的名字的值
setattr  爲一個變量增長或者修改一個屬性
delattr  刪除一個變量中的屬性或者方法
d = {'k':'v'}  #d.keys()
print(getattr(d,'keys')())
f = open()  # f文件操做對象
f.read()    # 文件對象.read方法

打印結果:spa

不詳
不詳
male
{'name': '小黑', 'age': 18}
{'name': '小黑', 'age': 18, 'func': <function wahaha at 0x00000000003B2E18>}
1 2
dict_keys(['k'])ssr

 

包內的文件對象

# 包
# import 包名   ---> 包內的__init__文件

# def sww():
#     print('爽歪歪')
# count = 0
import sys
# print(sys.modules[__name__])  # 必定是aaa.py
# print(sys.modules['__main__'])  # 不肯定的
# print(getattr(sys.modules[__name__],'count'))
# getattr(sys.modules[__name__],'sww')()
# print(sys.modules[__name__])
# # print(sys.modules['my_moudle'])
# # print(my_moudle)
# print(getattr(sys.modules['my_moudle'],'qqxing'))

# 反射類中的名字
# getattr(類名,'靜態屬性')
# getattr(類名,'類方法')()
# getattr(類名,'靜態方法')()

# 反射對象中的名字
# getattr(對象名,'對象屬性')
# getattr(對象名,'方法名')()

# 反射模塊中的名字
# import 模塊名
# getattr(模塊名,'模塊中的變量')
# getattr(模塊名,'模塊中的函數')()
# getattr(模塊名,'模塊中的類名')

# 反射當前模塊中的名字
# import sys
# getattr(sys.modules[__name__],'變量')
# getattr(sys.modules[__name__],'函數')()
# getattr(sys.modules[__name__],'類名')

# sys.modules[__name__]
# import sys
# print(sys.modules[__name__])  # 全部導入過的模塊
# {'字符串數據類型的模塊名':模塊的內存地址}
# {'__main__':當前模塊的內存地址}

# 怎麼反射類 ?
# class Student:
#     def __init__(self,name,age):
#         self.name = name
#         self.age = age
#     def show_student(self):
#         for key in self.__dict__:
#             print(key,self.__dict__[key])
#
# class Teacher:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def show_teacher(self):
#         for key in self.__dict__:
#             print(key, self.__dict__[key])
#
# class Manager:
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def show_manager(self):
#         for key in self.__dict__:
#             print(key, self.__dict__[key])
# # hei = Student('小黑',18)
# import sys
# main = sys.modules[__name__]
# # import my_moudle
# # cls = getattr(my_moudle,'Student')
# # hei = cls('小黑',18)
# # print(hei,hei.__dict__)
#
# # 'Manager' 'Teacher' 'Student'
# # 獲取字符串數據類型的類名
# cls_name = input('>>>')
#
# # 根據輸入反射找到具體的類
# if hasattr(main,cls_name):
#     cls = getattr(main,cls_name)
#
# # 實例化對象
# alex = cls('alex',81)
# print(type(alex))
# # 展現這個對象中的全部方法
# for i in alex.__dict__:
#     print(i,alex.__dict__[i])
#
# # 用反射的知識 實現
#     # 寫一我的類,這我的類 沒有任何屬性 實例化這個類 而後根據你的姓名和年齡爲這個對象添加屬性 (基礎)
#     # 登陸成功以後自動建立和用戶身份匹配的類的對象
相關文章
相關標籤/搜索