python之反射

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

    def show(self):
        return '%s---%s' % (self.name, self.age)

obj = Foo('alex', 18)
# 去什麼東西里獲取什麼屬性
# inp = input('>>>')
# ret = getattr(obj, inp)
# print(ret)
# >>>show
# <bound method Foo.show of <__main__.Foo object at 0x000001D1B7D12BA8>>
# >>>name
# alex
func = getattr(obj, 'show')
print(func)
r = func()
print(r)
# <bound method Foo.show of <__main__.Foo object at 0x0000020C94C74080>>
# alex---18
# 檢測obj裏是否有'name'
print(hasattr(obj, 'name'))  # True
setattr(obj, 'k1', 'v1')
print(obj.k1)  # v1
delattr(obj, 'k1')
print(obj.k1)  # AttributeError: 'Foo' object has no attribute 'k1'

反射中的一些方法:getattr、setattr、hasattr、delattr,通過字符串的形式操作對象的成員。

 

在同一目錄下建立s1.py   s2.py。

s2.py

NAME = 'alex'

def func():
    return 'func'


class Foo:
    def __init__(self):
        self.name = 123

s1.py

import s2
# r1 = s2.NAME
# r2 = s2.func()
# print(r1)
# print(r2)
# alex
# func

r1 = getattr(s2, 'NAME')
print(r1)
result = getattr(s2, 'func')
r2 = result()
print(r2)
# alex
# func

cls = getattr(s2, 'Foo')
print(cls)  # <class 's2.Foo'>
obj = cls()
print(obj.name)  # 123

舉個例子

s1.py

import s2
inp = input('請輸入要查看的URL:')

if hasattr(s2, inp):
    func = getattr(s2, inp)
    result = func()
    print(result)
else:
    print('404')

s2.py

def f1():
    return '首頁'

def f2():
    return '新聞'

def f3():
    return '精華'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章