python面向?qū)ο?反射原理解析
一、靜態(tài)方法(staticmethod)和類(lèi)方法(classmethod)
類(lèi)方法:有個(gè)默認(rèn)參數(shù)cls,并且可以直接用類(lèi)名去調(diào)用,可以與類(lèi)屬×××互(也就是可以使用類(lèi)屬性)
靜態(tài)方法:讓類(lèi)里的方法直接被類(lèi)調(diào)用,就像正常調(diào)用函數(shù)一樣
類(lèi)方法和靜態(tài)方法的相同點(diǎn):都可以直接被類(lèi)調(diào)用,不需要實(shí)例化
類(lèi)方法和靜態(tài)方法的不同點(diǎn):
- 類(lèi)方法必須有一個(gè)cls參數(shù)表示這個(gè)類(lèi),可以使用類(lèi)屬性
- 靜態(tài)方法不需要參數(shù)
綁定方法:分為普通方法和類(lèi)方法
- 普通方法:默認(rèn)有一個(gè)self對(duì)象傳進(jìn)來(lái),并且只能被對(duì)象調(diào)用-------綁定到對(duì)象
- 類(lèi)方法:默認(rèn)有一個(gè)cls對(duì)象傳進(jìn)來(lái),并且可以被類(lèi)和對(duì)象(不推薦)調(diào)用-----綁定到類(lèi)
- 非綁定方法:靜態(tài)方法:沒(méi)有設(shè)置默認(rèn)參數(shù),并且可以被類(lèi)和對(duì)象(不推薦)調(diào)用-----非綁定
import time
class Date:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
# @staticmethod
# def now():
# t=time.localtime()
# return Date(t.tm_year,t.tm_mon,t.tm_mday)
@classmethod #改成類(lèi)方法
def now(cls):
t=time.localtime()
return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪個(gè)類(lèi)來(lái)調(diào)用,即用哪個(gè)類(lèi)cls來(lái)實(shí)例化
class EuroDate(Date):
def __str__(self):
return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)
e=EuroDate.now()
print(e) #我們想觸發(fā)EuroDate.__str__,此時(shí)e就是由EuroDate產(chǎn)生的,結(jié)果如我們所愿
'''
輸出結(jié)果:
year:2017 month:3 day:3
'''
二、反射
反射:可以用字符串的方式去訪問(wèn)對(duì)象的屬性,調(diào)用對(duì)象的方法(但是不能去訪問(wèn)方法),python中一切皆對(duì)象,都可以使用反射。
反射有四種方法:
hasattr:hasattr(object,name)判斷一個(gè)對(duì)象是否有name屬性或者name方法。有就返回True,沒(méi)有就返回False
getattr:獲取對(duì)象的屬性或者方法,如果存在則打印出來(lái)。hasattr和getattr配套使用
需要注意的是,如果返回的是對(duì)象的方法,返回出來(lái)的是對(duì)象的內(nèi)存地址,如果需要運(yùn)行這個(gè)方法,可以在后面添加一對(duì)()
setattr:給對(duì)象的屬性賦值,若屬性不存在,先創(chuàng)建后賦值
delattr:刪除該對(duì)象指定的一個(gè)屬性
1、對(duì)象應(yīng)用反射
class Foo:
def __init__(self):
self.name = 'egon'
self.age = 51
def func(self):
print('hello')
egg = Foo()
print(hasattr(egg,'name')) #先判斷name在egg里面存在不存在,結(jié)果是True
print(getattr(egg,'name')) #如果為T(mén)rue它才去得到,結(jié)果是egon
print(hasattr(egg,'func')) #結(jié)果是True
print(getattr(egg,'func')) #得到的是地址<bound method Foo.func of <__main__.Foo object at 0x0000000001DDA2E8>>
getattr(egg,'func')() #在這里加括號(hào)才能得到,因?yàn)閒unc是方法,結(jié)果是hello
一般用法如下,先判斷是否hasattr,然后取getattr
if hasattr(egg,'func'):
getattr(egg,'func')() #結(jié)果是hello
else:
print('沒(méi)找到')
2、類(lèi)應(yīng)用反射
class Foo:
f = 123
@classmethod
def class_method_dome(cls):
print('class_method_dome')
@staticmethod
def static_method_dome():
print('static_method_dome')
print(hasattr(Foo,'class_method_dome')) #結(jié)果是True
method = getattr(Foo,'class_method_dome')
method() #結(jié)果是class_method_dome
print(hasattr(Foo,'static_method_dome')) #結(jié)果是True
method1 = getattr(Foo,'static_method_dome')
method1() #結(jié)果是static_method_dome
3、模塊應(yīng)用反射
# 1.導(dǎo)入其他模塊引用
import mymodule print(hasattr(mymodule,'test')) getattr(mymodule,'test')() p = getattr(mymodule,'test') p() #相當(dāng)于上面getattr(mymodule,'test')()
# 2.在本模塊中應(yīng)用反射
def demo1():
print('hello')
import sys
module_obj = sys.modules[__name__] #相當(dāng)于'__main__'
print(module_obj) #結(jié)果是<module '__main__' from 'C:/Users/Administrator/Desktop/test.py'>
print(hasattr(module_obj,'demo1')) #結(jié)果是True
getattr(module_obj,'demo1')() #結(jié)果是hello
導(dǎo)入自己的模塊的例子:
def 注冊(cè)():
print('regiester')
def 登錄():
print('login')
def 購(gòu)物():
pass
print('注冊(cè),登錄,購(gòu)物')
ret = input('請(qǐng)輸入你要做的操作:')
import sys
my_module = sys.modules[__name__] #利用sys模塊導(dǎo)入一個(gè)自己的模塊
if hasattr(my_module,ret):
getattr(my_module,ret)()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何讀取MySQL數(shù)據(jù)庫(kù)表數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Python如何讀取MySQL數(shù)據(jù)庫(kù)表數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
python使用pip成功導(dǎo)入庫(kù)后還是報(bào)錯(cuò)的解決方法(針對(duì)vscode)
最近在學(xué)爬蟲(chóng),但在使用Scrapy包時(shí),在終端通過(guò)pip裝好包以后,在pycharm中導(dǎo)入包時(shí),依然會(huì)報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于python使用pip成功導(dǎo)入庫(kù)后還是報(bào)錯(cuò)的解決方法,需要的朋友可以參考下2022-07-07
Python?mistune庫(kù)靈活的Markdown解析器使用實(shí)例探索
本文將深入介紹Python?Mistune,包括其基本概念、安裝方法、示例代碼以及一些高級(jí)用法,以幫助大家充分利用這一工具來(lái)處理Markdown文本2024-01-01
python檢測(cè)遠(yuǎn)程服務(wù)器tcp端口的方法
這篇文章主要介紹了python檢測(cè)遠(yuǎn)程服務(wù)器tcp端口的方法,涉及Python操作socket檢測(cè)tcp端口的技巧,需要的朋友可以參考下2015-03-03
Python中py文件轉(zhuǎn)換成exe可執(zhí)行文件的方法
這篇文章主要介紹了Python中py文件轉(zhuǎn)換成exe可執(zhí)行文件的方法,需要的朋友可以參考下2019-06-06
python numpy數(shù)組的索引和切片的操作方法
NumPy 是一個(gè) Python 包。 它代表 “Numeric Python”。它是一個(gè)由多維數(shù)組對(duì)象和用于處理數(shù)組的例程集合組成的庫(kù)。這篇文章主要介紹了python numpy 數(shù)組的索引和切片,需要的朋友可以參考下2018-10-10
python實(shí)現(xiàn)隨機(jī)梯度下降(SGD)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)隨機(jī)梯度下降SGD,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

