Python面向對象之反射

什麼是反射?#是什麼
答:用字符串數據類型的變量名來訪問這個變量的值
反射的方法:getattr hasattr setattr delattr
好處:優化代碼

1.getattr
	用法:getattr(object, name[,default]) -> value
	返回object中name字符串對應的方法和屬性,不存在返回默認值default。
	若是沒有傳default,那麼找不到就會報錯
	#用在哪,怎麼用?
	#類   靜態屬性,靜態方法,類方法
	class A:
	    ATTR = '靜態屬性'
	    @classmethod
	    def func0(cls):
	        print('類方法')
	    @staticmethod
	    def func1():
	        print('靜態方法')

	#反射查看屬性
	print(getattr(A, 'ATTR'))
	#反射調用類方法
	getattr(A, 'func0')()
	#反射調用靜態方法
	getattr(A, 'func1')()


	#對象   對象屬性,對象方法
	class B:
	    def __init__(self, name):
	        self.name = name

	    def func0(self):
	        print('普通方法')
	b = B('Jake')
	#反射查看對象屬性
	print(getattr(b, 'name'))
	#反射查看對象方法
	getattr(b, 'func0')()


	#模塊
	import os
	print(os.sep)
	print(getattr(os, 'sep'))

	#反射本身模塊中的內容,須要先找到本身當前文件所在的命名空間
	import sys
	def func0():
	    print('my_func0')
	my_namespace = sys.modules['__main__']
	my_namespace.func0()
	getattr(my_namespace, 'func0')()

2.hasattr
	用法:hasattr(object, name) #判斷object中有沒有一個name字符串對應的方法和屬性
								#若是存在返回True,不存在返回False,通常與getattr配合使用
	class A:
	    ATTR = '靜態屬性'
	print(hasattr(A, 'ATTR'))#Trule
	print(hasattr(A, 's'))#False

3.setattr
	用法:setattr(object, name, value)
	修改object中name字符串對應的屬性name變爲value
	class A:
	    ATTR = '靜態屬性'
	    @staticmethod
	    def func1():
	        print('靜態方法')
	setattr(A, 'ATTR', '靜態屬性大哥')
	print(A.ATTR)

4.delattr
	用法:delattr(object, name)
	刪除object中name字符串對應的屬性和方法
	class A:
	    ATTR = '靜態屬性'
	    @staticmethod
	    def func1():
	        print('靜態方法')
	print(A.__dict__)
	delattr(A, 'ATTR')
	delattr(A, 'func1')
	print(A.__dict__)
相關文章
相關標籤/搜索