欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python面向?qū)ο?反射原理解析

 更新時(shí)間:2019年08月12日 10:17:01   作者:宋鵬超  
這篇文章主要介紹了python面向?qū)ο?反射原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

一、靜態(tài)方法(staticmethod)和類方法(classmethod)

類方法:有個(gè)默認(rèn)參數(shù)cls,并且可以直接用類名去調(diào)用,可以與類屬×××互(也就是可以使用類屬性)

靜態(tài)方法:讓類里的方法直接被類調(diào)用,就像正常調(diào)用函數(shù)一樣

類方法和靜態(tài)方法的相同點(diǎn):都可以直接被類調(diào)用,不需要實(shí)例化

類方法和靜態(tài)方法的不同點(diǎn):

  • 類方法必須有一個(gè)cls參數(shù)表示這個(gè)類,可以使用類屬性
  • 靜態(tài)方法不需要參數(shù)

綁定方法:分為普通方法和類方法

  • 普通方法:默認(rèn)有一個(gè)self對(duì)象傳進(jìn)來,并且只能被對(duì)象調(diào)用-------綁定到對(duì)象
  • 類方法:默認(rèn)有一個(gè)cls對(duì)象傳進(jìn)來,并且可以被類和對(duì)象(不推薦)調(diào)用-----綁定到類
  • 非綁定方法:靜態(tài)方法:沒有設(shè)置默認(rèn)參數(shù),并且可以被類和對(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     #改成類方法
  def now(cls):
    t=time.localtime()
    return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪個(gè)類來調(diào)用,即用哪個(gè)類cls來實(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
'''

二、反射

反射:可以用字符串的方式去訪問對(duì)象的屬性,調(diào)用對(duì)象的方法(但是不能去訪問方法),python中一切皆對(duì)象,都可以使用反射。

反射有四種方法:

hasattr:hasattr(object,name)判斷一個(gè)對(duì)象是否有name屬性或者name方法。有就返回True,沒有就返回False

getattr:獲取對(duì)象的屬性或者方法,如果存在則打印出來。hasattr和getattr配套使用

需要注意的是,如果返回的是對(duì)象的方法,返回出來的是對(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'))   #如果為True它才去得到,結(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('沒找到')

2、類應(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模擬斗地主發(fā)牌

    python模擬斗地主發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了python模擬斗地主發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Python聚類算法之凝聚層次聚類實(shí)例分析

    Python聚類算法之凝聚層次聚類實(shí)例分析

    這篇文章主要介紹了Python聚類算法之凝聚層次聚類的原理與具體使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器效果

    Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器效果

    Tkinter 是 Python 的標(biāo)準(zhǔn) GUI(Graphical User Interface,圖形用戶接口)庫(kù),Python 使用 Tkinter 可以快速地創(chuàng)建 GUI 應(yīng)用程序。這篇文章主要介紹了Python使用Tkinter實(shí)現(xiàn)滾動(dòng)抽獎(jiǎng)器,需要的朋友可以參考下
    2020-01-01
  • 對(duì)python同一個(gè)文件夾里面不同.py文件的交叉引用方法詳解

    對(duì)python同一個(gè)文件夾里面不同.py文件的交叉引用方法詳解

    今天小編就為大家分享一篇對(duì)python同一個(gè)文件夾里面不同.py文件的交叉引用方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python中Django框架下的staticfiles使用簡(jiǎn)介

    Python中Django框架下的staticfiles使用簡(jiǎn)介

    這篇文章主要介紹了Python中Django框架下的staticfiles使用簡(jiǎn)介,staticfiles是一個(gè)幫助Django管理靜態(tài)資源的工具,需要的朋友可以參考下
    2015-05-05
  • 解決python寫入帶有中文的字符到文件錯(cuò)誤的問題

    解決python寫入帶有中文的字符到文件錯(cuò)誤的問題

    今天小編就為大家分享一篇解決python寫入帶有中文的字符到文件錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python標(biāo)準(zhǔn)庫(kù)之sys模塊用法詳解

    Python標(biāo)準(zhǔn)庫(kù)之sys模塊用法詳解

    “sys”即“system”,“系統(tǒng)”之意,該模塊提供了一些接口,用于訪問?Python?解釋器自身使用和維護(hù)的變量,同時(shí)模塊中還提供了一部分函數(shù),可以與解釋器進(jìn)行比較深度的交互,本文就給大家詳細(xì)的介紹一下Python?sys模塊,需要的朋友可以參考下
    2023-08-08
  • Python加密方法小結(jié)【md5,base64,sha1】

    Python加密方法小結(jié)【md5,base64,sha1】

    這篇文章主要介紹了Python加密方法,結(jié)合實(shí)例形式總結(jié)分析了md5,base64,sha1的簡(jiǎn)單加密方法,需要的朋友可以參考下
    2017-07-07
  • PyCharm 2019.3發(fā)布增加了新功能一覽

    PyCharm 2019.3發(fā)布增加了新功能一覽

    這篇文章主要介紹了PyCharm 2019.3發(fā)布,增加了新功能一覽,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 如何在python中判斷變量的類型

    如何在python中判斷變量的類型

    這篇文章主要介紹了如何在python中判斷變量的類型,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07

最新評(píng)論