随笔 - 77  文章 - 0  评论 - 0  阅读 - 21363 
# ### (1)与类相关的魔术属性
class Man():
pass

class Woman():
pass

class Children(Man,Woman):
"""
成员属性:eye skin
成员方法:eat cry 私有sleep
"""

eye = "天蓝色"
skin = "天蓝色"

def eat(self):
print("小孩下来就会吃奶奶")

def cry(self,func):
print("小孩哭起来,地动山摇,天崩地裂,海枯石烂")
print(func.__name__,type(func.__name__)) # 可以获取函数名或者类名

def __sleep():
print("小孩睡觉的时候,不喜欢别人干扰它")

obj = Children()
# __dict__ 获取对象或类的内部成员结构
# 对象
res = obj.__dict__
print(res)
# 类
res = Children.__dict__
print(res)

# __doc__ 获取对象或类的内部文档
print(Children.__doc__)

# __name__ 获取类名函数名
def abc():
print("abc")
obj.cry(abc)

# __class__ 获取当前对象所属的类
res = obj.__class__
print(res)

# __bases__ 获取一个类直接继承的所有父类,返回元组
print(Children.__bases__)

# ### (2) 反射
# 通过字符串去操作类对象 或者 模块中的属性方法

# (1)类中的反射
# 1.hasattr() 检测对象/类是否有指定的成员
# 对象
res = hasattr(obj,"eye")
print(res)
res = hasattr(obj,"eat")
print(res)

# 类
res = hasattr(Children,"skin")
print(res)

# 2.getattr() 获取对象/类成员的值
# 对象
res = getattr(obj,"eye")
print(res)
# 通过对象把方法反射出来,是绑定方法
func = getattr(obj,"eat")
print(func)
func()
# 通过类把方法反射出来,是普通方法
func = getattr(Children,"eat")
print(func)
func(1)
# 可以为getattr设置默认值,如果找不到该成员,在第三个参数上可以设置相应的返回值
res = getattr(Children,"abc","对不起,没有该成员")
print(res)

# 小应用
"""
strvar = input("请输入你要操作的成员:")
if hasattr(obj,strvar):
func = getattr(obj,strvar)
func()
else:
print("对不起,没有该成员")
"""

# 3.setattr() 设置对象/类成员的值
# 对象
setattr(obj,"hair","天蓝色的")
print(obj.hair)
# 类
setattr(Children,"age",lambda : print("小孩下生后,是一个肉球"))
Children.age()


# 4.delattr() 删除对象/类成员的值
# 对象
delattr(obj,"hair")
# print(obj.hair)
# 类
delattr(Children,"age")
# Children.age()



# (2)模块的反射
import sys
# sys.modules 返回一个系统字典,字典的键是加载的所有模块
print(sys.modules)
"""
__main__
{'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_warnings': <module '_warnings' (built-in)>, '_thread': <module '_thread' (built-in)>, '_weakref': <module '_weakref' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, '_io': <module 'io' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'posix': <module 'posix' (built-in)>, 'zipimport': <module 'zipimport' (built-in)>, 'encodings': <module 'encodings' from '/usr/lib/python3.6/encodings/__init__.py'>, 'codecs': <module 'codecs' from '/usr/lib/python3.6/codecs.py'>, '_codecs': <module '_codecs' (built-in)>, 'encodings.aliases': <module 'encodings.aliases' from '/usr/lib/python3.6/encodings/aliases.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from '/usr/lib/python3.6/encodings/utf_8.py'>, '_signal': <module '_signal' (built-in)>,
'__main__': <module '__main__' from '/mnt/hgfs/gongxiang8/day22/2.module.py'>, 'encodings.latin_1': <module 'encodings.latin_1' from '/usr/lib/python3.6/encodings/latin_1.py'>, 'io': <module 'io' from '/usr/lib/python3.6/io.py'>, 'abc': <module 'abc' from '/usr/lib/python3.6/abc.py'>, '_weakrefset': <module '_weakrefset' from '/usr/lib/python3.6/_weakrefset.py'>, 'site': <module 'site' from '/usr/lib/python3.6/site.py'>, 'os': <module 'os' from '/usr/lib/python3.6/os.py'>, 'errno': <module 'errno' (built-in)>, 'stat': <module 'stat' from '/usr/lib/python3.6/stat.py'>, '_stat': <module '_stat' (built-in)>, 'posixpath': <module 'posixpath' from '/usr/lib/python3.6/posixpath.py'>, 'genericpath': <module 'genericpath' from '/usr/lib/python3.6/genericpath.py'>, 'os.path': <module 'posixpath' from '/usr/lib/python3.6/posixpath.py'>, '_collections_abc': <module '_collections_abc' from '/usr/lib/python3.6/_collections_abc.py'>, '_sitebuiltins': <module '_sitebuiltins' from '/usr/lib/python3.6/_sitebuiltins.py'>, '_bootlocale': <module '_bootlocale' from '/usr/lib/python3.6/_bootlocale.py'>, '_locale': <module '_locale' (built-in)>, 'sysconfig': <module 'sysconfig' from '/usr/lib/python3.6/sysconfig.py'>, '_sysconfigdata_m_linux_x86_64-linux-gnu': <module '_sysconfigdata_m_linux_x86_64-linux-gnu' from '/usr/lib/python3.6/_sysconfigdata_m_linux_x86_64-linux-gnu.py'>, 'sitecustomize': <module 'sitecustomize' from '/usr/lib/python3.6/sitecustomize.py'>, 'encodings.cp437': <module 'encodings.cp437' from '/usr/lib/python3.6/encodings/cp437.py'>}

"""
mymodule = sys.modules["__main__"]
print(mymodule)

def func1():
print(1)

def func2():
print(2)

def func3():
print(3)

def func4():
print(4)

# 通过字符串操作模块中的成员
while True:
func = input("请用户输入您要操作的函数")
if hasattr(mymodule,func):
# 反射真实的函数
fuc = getattr(mymodule,func)
fuc()
else:
print("这个函数不存在")










posted on   rider_yang  阅读(61)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示