反射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])
#
# # 用反射的知识 实现
#     # 写一我的类,这我的类 没有任何属性 实例化这个类 而后根据你的姓名和年龄为这个对象添加属性 (基础)
#     # 登陆成功以后自动建立和用户身份匹配的类的对象
相关文章
相关标签/搜索