专业编程基础技术教程

网站首页 > 基础教程 正文

python反射

ccvgpt 2024-08-05 12:13:09 基础教程 17 ℃

isinstance和issubclass

class Foo:
    pass

class Son(Foo):
    pass

s = Son()
#判断一个对象是不是这个类的对象,传两个参数(对象,类)
# print(isinstance(s,Son))
# print(isinstance(s,Foo))
# print(type(s) is Son)
# print(type(s) is Foo)

#判断一个类是不是另一类的子类,传两个参数(子类,父类)
print(issubclass(Son,Foo))
print(issubclass(Son,object))
print(issubclass(Foo,object))
print(issubclass(int,object))

反射

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个方法:hasattr(),getattr(),setattr(),delattr()

1.对象中

class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def fun(self):
        print("...........ctz")


f = Foo("tiga", 21)
print(hasattr(f, "name"))  # True
print(hasattr(f, "age"))  # True
print(hasattr(f, "fun"))  # True
print(getattr(f, "name"))  # tiga
print(getattr(f, "age"))  # 21
print(getattr(f, "fun"))  # <bound method Foo.fun of <__main__.Foo object at 0x7ff760d54b10>>
fu = getattr(f, "fun")
fu()  # ...........ctz

print("".center(50, "-"))

setattr(f, "name", "tiga")
setattr(f, "age", 73)

print(f.name, f.age)  # tiga 73

print("--------------------")

delattr(f, "name")
print(f.name)
"""
Traceback (most recent call last):
  File "xx.py", line 30, in <module>
    print(f.name)
AttributeError: 'Foo' object has no attribute 'name'
"""

2.类中

class Foo:
    f=123
    @staticmethod
    def static():
        print("static......")

    @classmethod
    def clas(cls):
        print(cls.f,"class.............")


print(hasattr(Foo,"f"))
print(hasattr(Foo,"static"))
print(hasattr(Foo,"clas"))


if hasattr(Foo,"f"):
    print(getattr(Foo,"f"))

print(getattr(Foo,"static"))
print(getattr(Foo,"clas"))
s=getattr(Foo,"static")
s()
c=getattr(Foo,"clas")
c()
True
True
True
123
<function Foo.static at 0x000000000241B9D8>
<bound method Foo.clas of <class '__main__.Foo'>>
static......
123 class............

3.模块

import sys

import my_module
from my_module import test

print(hasattr(my_module, 'test'))
func_test = getattr(my_module, 'test')
func_test()
getattr(my_module, 'test')()


# import其他模块应用反射


def demo1():
    print('demo1')


print(__name__)  # '__main__'
print(sys.modules)
# '__main__': <module '__main__' from 'xx.py'>
module_obj = sys.modules[__name__]  # sys.modules['__main__']
# module_obj : <module '__main__' from 'xx.py'>
print(module_obj)
print(hasattr(module_obj, 'demo1'))
getattr(module_obj, 'demo1')()

python反射

Tags:

最近发表
标签列表