Python学习基础笔记六十二——反射2

1、

isinstanace(obj, cls)   # 检查是否obj是否是类cls的对象:

class Foo(object):
    pass


obj = Foo()

print(isinstance(obj, Foo))

结果返回:True。

issubclass(sub, super)    # 检查sub类是否是 super 类的派生类

class Foo(object):
    pass


class Bar(Foo):
    pass


print(issubclass(Bar, Foo))

结果返回为:True。

2、反射:

1)反射的概念是由smith在1982时首次提出,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这个概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在lisp和面向对象方面取得成就。

2)python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)。

四个可以实现自省的函数:

name = 1
eval('print(name)')     # 安全隐患

使用反射,就没有安全问题。

3、反射对象的属性:

class A:
    def func(self):
        print('in func')


a = A()
a.name = 'alex'

ret = getattr(a, 'name')   # 通过变量名的字符串形式取到值
print(ret)

4、反射对象的方法:

class A:
    def func(self):
        print('in func')


a = A()
a.name = 'alex'

ret = getattr(a, 'func')
ret()

5、反射类的属性:

class A:
    price = 20
    @classmethod
    def func(cls):
        print('in func')


a = A()
a.name = 'alex'

ret = getattr(A, 'price')
print(ret)

ret2 = getattr(A, 'func')
ret2()

6、反射模块的属性,反射模块的方法:另外,内置模块也能用。

# my.py

day = 'Monday'    # 变量day

def wahaha():
    print('wahaha')
import my

ret = getattr(my, 'day')
print(ret)

ret2 = getattr(my, 'wahaha')
ret2()

7、反射自己模块的变量和方法:

import sys


def qqxing():
    print('qqxing')


year = 2023

print(getattr(sys.modules['__main__'], 'year'))
getattr(sys.modules['__main__'], 'qqxing')()

import sys


def qqxing():
    print('qqxing')


year = 2023

arg = input('>>>')
print(getattr(sys.modules['__main__'], arg))
# print(getattr(sys.modules['__main__'], 'year'))
# getattr(sys.modules['__main__'], 'qqxing')()

8、一个模块中的类能不能反射得到。

import my

print(getattr(my, 'C')())

9、setattr:设置修改变量

class A:
    pass

a = A()

setattr(a, 'name', 'chang')
setattr(A, 'name', 'alex')

print(A.name)
print(a.name)

10、delattr:删除一个变量

class A:
    pass

a = A()

setattr(a, 'name', 'chang')
setattr(A, 'name', 'alex')

print(A.name)
print(a.name)

delattr(a, 'name')
print(a.name)

结果:

Python学习基础笔记六十二——反射2_第1张图片

 

你可能感兴趣的:(Python,python)