91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python面向對象之反射

發布時間:2020-07-26 12:26:34 來源:網絡 閱讀:450 作者:宋鵬超 欄目:編程語言

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


類方法:有個默認參數cls,并且可以直接用類名去調用,可以與類屬×××互(也就是可以使用類屬性)

靜態方法:讓類里的方法直接被類調用,就像正常調用函數一樣


類方法和靜態方法的相同點:都可以直接被類調用,不需要實例化

類方法和靜態方法的不同點:

  類方法必須有一個cls參數表示這個類,可以使用類屬性

  靜態方法不需要參數


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

     普通方法:默認有一個self對象傳進來,并且只能被對象調用-------綁定到對象

      類方法:默認有一個cls對象傳進來,并且可以被類和對象(不推薦)調用-----綁定到類


非綁定方法:靜態方法:沒有設置默認參數,并且可以被類和對象(不推薦)調用-----非綁定


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) #哪個類來調用,即用哪個類cls來實例化
class EuroDate(Date):
    def __str__(self):
        return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)
e=EuroDate.now()
print(e)               #我們想觸發EuroDate.__str__,此時e就是由EuroDate產生的,結果如我們所愿
'''
輸出結果:
year:2017 month:3 day:3
'''

二、反射

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


反射有四種方法:

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

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

    需要注意的是,如果返回的是對象的方法,返回出來的是對象的內存地址,如果需要運行這個方法,可以在后面添加一對()

setattr:給對象的屬性賦值,若屬性不存在,先創建后賦值

delattr:刪除該對象指定的一個屬性


1、對象應用反射

class Foo:
    def __init__(self):
        self.name = 'egon'
        self.age = 51
    def func(self):
        print('hello')
egg = Foo()

print(hasattr(egg,'name'))      #先判斷name在egg里面存在不存在,結果是True
print(getattr(egg,'name'))      #如果為True它才去得到,結果是egon
print(hasattr(egg,'func'))     #結果是True
print(getattr(egg,'func'))     #得到的是地址<bound method Foo.func of <__main__.Foo object at 0x0000000001DDA2E8>>
getattr(egg,'func')()        #在這里加括號才能得到,因為func是方法,結果是hello

一般用法如下,先判斷是否hasattr,然后取getattr
if hasattr(egg,'func'):
    getattr(egg,'func')()   #結果是hello
else:
    print('沒找到')

2、類應用反射

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'))         #結果是True
method = getattr(Foo,'class_method_dome')
method()                               #結果是class_method_dome

print(hasattr(Foo,'static_method_dome'))         #結果是True
method1 = getattr(Foo,'static_method_dome')
method1()                              #結果是static_method_dome

3、模塊應用反射

# 1.導入其他模塊引用

import mymodule
print(hasattr(mymodule,'test'))
getattr(mymodule,'test')()


p = getattr(mymodule,'test')
p()                              #相當于上面getattr(mymodule,'test')()

# 2.在本模塊中應用反射

def demo1():
    print('hello')
import sys
module_obj = sys.modules[__name__]        #相當于'__main__'
print(module_obj)                 #結果是<module '__main__' from 'C:/Users/Administrator/Desktop/test.py'>
print(hasattr(module_obj,'demo1'))       #結果是True
getattr(module_obj,'demo1')()          #結果是hello

導入自己的模塊的例子:

def 注冊():
    print('regiester')
def 登錄():
    print('login')
def 購物():
    pass
print('注冊,登錄,購物')
ret = input('請輸入你要做的操作:')
import sys
my_module = sys.modules[__name__]  #利用sys模塊導入一個自己的模塊
if hasattr(my_module,ret):
    getattr(my_module,ret)()



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长武县| 孟州市| 娱乐| 扎兰屯市| 磴口县| 中牟县| 南宫市| 保靖县| 环江| 建阳市| 崇信县| 西乌珠穆沁旗| 开封市| 来宾市| 紫金县| 合阳县| 腾冲县| 蒲江县| 武功县| 阳春市| 泸溪县| 当涂县| 成安县| 内丘县| 望谟县| 绵阳市| 茌平县| 开鲁县| 昂仁县| 周宁县| 沧州市| 额敏县| 砀山县| 罗定市| 鄯善县| 延津县| 永善县| 栾城县| 宝山区| 绵阳市| 花垣县|