码迷,mamicode.com
首页 > 其他好文 > 详细

day,23,非常重要。反射

时间:2018-04-18 20:12:37      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:存储   info   main   --   import   导入   __init__   访问   ict   

一、内置函数


# class B:pass
# class A(B):pass
# a = A()
# print(isinstance(a,A))
# print(isinstance(a,B)) # 能够检测到继承关系
# print(type(a) is A)
# print(type(a) is B) # type只单纯的判断类
# 判断一个对象和一个类有没有血缘关系
# isinstance(a,A)

class B:pass
class C(B):pass
class D(C):pass
print(issubclass(C,D))
print(issubclass(D,C))
print(issubclass(B,C))
print(issubclass(C,B))
print(issubclass(D,B))
# issubclass(子类名,父类名) 如果返回True,说明有继承关系

二、反射

# ******
# 类
# role = 123
# print(eval(‘role‘))
# class A:
# role = ‘Person‘
# def func(self):
# print(‘*‘*self)
# # ret = input(‘>>>‘)
# # print(A.__dict__[ret])
# # getattr
# print(getattr(A,‘role‘)) # 从A的命名空间里找一个属性 ,直接就可以找到这个属性的值
# f = getattr(A,‘func‘);f(1) # 从A的命名空间里找一个方法 ,找到的是这个方法的内存地址
# getattr(A,‘func‘)(1)
# A.func(1)
# 反射
# 正常情况下如果可以拿到这个变量 那么如有有这个变量的字符串形式 就是用反射可以获取到这个值
# 使用字符串数据类型的变量名 访问一个命名空间中的名字
# 找一个属性 ,直接就可以找到这个属性的值
# 找一个方法 ,找到的是这个方法的内存地址
# hasattr() 判断一个命名空间中有没有这个名字
# getattr() 从命名空间中获取这个名字对应的值

# 类中的反射
# 类可以获取类中的属性和方法

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


# print(hasattr(A,‘r‘))
# print(hasattr(A,‘role‘))
# print(hasattr(A,‘func‘))
# ret = input(‘>>>‘)
# if hasattr(A,ret):
# print(getattr(A,ret)) # getattr从A的命名空间里找一个属性 ,属性不存在会报错
# if hasattr(A,ret):
# func = getattr(A,ret)
# func(1)

# hasattr getattr
# class A:
# role = ‘Person‘
# def __init__(self):
# self.money = 500
# def func(self):
# print(‘*‘*10)
#
# a = A()
# print(a.func)
# getattr(a,‘func‘)()
# print(getattr(a,‘money‘))

# 类使用类命名空间中的名字
# 对象使用对象能用的方法和属性
# 模块使用模块中的名字
# import os ; getattr(os,‘rename‘)(‘user‘,‘user_info‘)
# 从自己所在的模块中使用自己名字

# 什么.什么
# import time # 一个py文件就是一个模块
# time.time()
# print(time.time())
# print(getattr(time,‘time‘)())

# import os
# os.rename(‘userinfo‘,‘user‘)
# getattr(os,‘rename‘)(‘user‘,‘user_info‘)

# ‘Teacher‘ -- Teacher
# import teacher
# alex = teacher.Teacher(‘alex‘)
# print(alex.__dict__)

import teacher #teacher文件,就是teacher模块
t = ‘Teacher‘
Teach_class = getattr(teacher,t) #找到teacher模块中的Teacher类
alex = Teach_class(‘alex‘) #实例化对象,跟teacher文件中的内容相对应,为了在登录的时候确认登录者的身份
print(teacher.Teacher(‘alex‘)) #打印实例化对象
print(teacher.Teacher(‘alex‘).name)
teacher.Teacher(‘alex‘).fun()
# print(teacher.Teacher(‘liu‘).fun())
# 或者:
# print(getattr(teacher,‘Teacher‘)(‘liu‘).name)
# print(getattr(teacher,‘Teacher‘)(‘liu‘).fun())
# a = 1
# b = 2
# def login():
# print(‘执行login功能‘)
#
# def register():
# print(‘执行register功能‘)

# import sys # 和python解释器相关的内容都在sys里
# print(sys.modules[‘__main__‘])
# func = input(‘>>>‘)
# if hasattr(sys.modules[‘__main__‘],func):
# getattr(sys.modules[‘__main__‘],func)()


# 类使用类命名空间中的名字
# getattr(类名,‘名字‘)
# 对象使用对象能用的方法和属性
# getattr(对象名,‘名字‘)
# 模块使用模块中的名字
# 导入模块
# getattr(模块名,‘名字‘)
# import os ; getattr(os,‘rename‘)(‘user‘,‘user_info‘)
# 从自己所在的模块中使用自己名字
# import sys
# getattr(sys.modules[‘__main__‘],名字)

# getattr一定要和hasattr配合使用

# 反射 4个内置函数
# getattr ******
# hasattr ******
# setattr # 修改和新建 **
# delattr # 删除一个属性 *

# 增删改 对象属性
# class A:
# def __init__(self,name):
# self.name = name
#
# def wahaha(self):
# print(‘wahahahahaha‘)
#
# a = A(‘alex‘)
# a.name
# a.wahaha()
# getattr(a,‘name‘)
# # a ‘age‘ = 18
# # a.age = 18
# print(a.__dict__)
# setattr(a,‘age‘,18) # 给a对象新增一个属性
# print(a.__dict__)
# setattr(a,‘name‘,‘egon‘)
# print(a.__dict__)
#
# # del a.age
# delattr(a,‘age‘)
# print(a.__dict__)


# 增删改 方法
# class A:
# def __init__(self,name):
# self.name = name
#
# def wahaha(self):
# print(‘wahahahahaha‘)
#
# def qqxing(self):
# print(‘qqqqqxing‘)
#
# a = A(‘alex‘)
# # setattr(A,‘qqxing‘,qqxing)
# setattr(a,‘qqxing‘,qqxing)
# # print(a.__dict__)
# a.qqxing(a)

三、内置方法

# 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__)
#
# # 有一个内置函数 和内置方法len()是唯一对应的关系
# a1 = A(‘alex‘,81,‘不详‘,2)
# a1.hobby = ‘烫头‘
# a2 = A(‘egon‘,20,‘不详‘,3)
# a3 = A(‘yuan‘,21,‘不详‘,4)
# print(len(a1))
# print(len(a2))
# print(len(a3))

# l = list([1,2,3,4,5])
# print(l)
# print(len(l))

# 内置的东西
# 都和内置的方法有着千丝万缕的联系

# 字典的存储
# 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 0
a1 = A(‘alex‘,81,‘不详‘,2)
print(hash(a1))























day,23,非常重要。反射

标签:存储   info   main   --   import   导入   __init__   访问   ict   

原文地址:https://www.cnblogs.com/zzw731862651/p/8877060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!