Python面向對象進階

1、面向對象那個進階之反射

  定義:所謂反射就是能夠經過字符串來操做Python代碼中的變量、函數、甚至類和方法。

    在反射中有四種自省方法,這四種方法適合類和對象(在Python中一切皆對象),下面是四種方法的說明:python

      hasattr 判斷某一個 變量 是否可以.調用一個名字,返回True或者False程序員

      getattr 直接獲取一個變量中的名字的值函數

      setattr 爲一個變量增長或者修改一個屬性
      delattr 刪除一個變量中的屬性或者方法性能

      反射方法使用說明:

        反射類中的名字

        getattr(類名,'靜態屬性')this

        getattr(類名,'類方法')()
        getattr(類名,'靜態方法')() 編碼

# class A: # name = 'Fang' # age = 18 # print(getattr(A,'name')) # getattr獲取類中的靜態屬性名字
         反射對象中的名字

        getattr(對象名,'對象屬性')
        getattr(對象名,'方法名')()spa

#!/usr/bin/python # -*- encodeing:utf-8 -*-
class Student: def __init__(self,name,age): self.name = name self.age = age def show(self): for key in self.__dict__: print(key,self.__dict__[key]) fang = Student('Fang',25) if hasattr(fang,'name'):   #使用hasattr 判斷對象屬性可否被調用
    print(getattr(fang,'name'))   #使用getattr獲取對象的屬性
if hasattr(fang,'show'): # 使用hasattr 判斷對象方法可否被調用
    getattr(fang,'show')()  # 使用getattr獲取對象的方法
setattr(fang,'sex','')  # 使用setattr添加一個對象屬性
getattr(fang,'show')() delattr(fang,'age')     #使用delattr 刪除一個對象的屬性
getattr(fang,'show')()
        反射模塊中的名字        

        import 模塊名
        getattr(模塊名,'模塊中的變量')
        getattr(模塊名,'模塊中的函數')()
        getattr(模塊名,'模塊中的類名')code

        反射當前模塊中的名字

        import sys
        getattr(sys.modules[__name__],'變量')
        getattr(sys.modules[__name__],'函數')()
        getattr(sys.modules[__name__],'類名')對象

#!/usr/bin/env python # -*- coding:utf-8 -*-
import sys def s1(): print 's1'
def s2(): print 's2' this_module = sys.modules[__name__] hasattr(this_module, 's1') getattr(this_module, 's2')

 

2、雙下劃線方法

  __str__和__repr__blog

    _repr__和__str__這兩個方法都是用於顯示的,__str__是面向用戶的,而__repr__面向程序員。

      打印操做會首先嚐試__str__和str內置函數(print運行的內部等價形式),它一般應該返回一個友好的顯示

      __repr__用於全部其餘的環境中:用於交互模式下提示迴應以及repr函數,若是沒有使用__str__,會使用print和str。它一般應該返回一個編碼字符串,能夠用來從新建立對象,或者給開發者詳細的顯示。

當咱們想全部環境下都統一顯示的話,能夠重構__repr__方法;當咱們想在不一樣環境下支持不一樣的顯示,例如終端用戶顯示使用__str__,而程序員在開發期間則使用底層的__repr__來顯示,實際上__str__只是覆蓋了__repr__以獲得更友好的用戶顯示

 

#!/usr/bin/python # -*- encodeing:utf-8 -*-
class Student: def __init__(self,name,age): self.name = name self.age = age def __str__(self):   #添加上__str__時打印類對象就會顯示下面的文字
        return '打印類對象時執行我'
    def __repr__(self):   #__repr__屬於str的備胎當這個類中沒有str這個方法時 程序會直接調用repr這個方法
        return '打印類對象時沒有str時執行我' fang = Student('Fang',25) print(fang)     #直接打印fang這個類對象,給咱們顯示的是一個內存地址,看着不是很友好

 

  __del__、__new__、__call__、__hash__

    __del__ 是析構方法。再刪除一個對象的時候調用,若是在刪除對象的時候,內部存在__del__方法,那麼在刪除一個對象以前先執行__del__方法中的代碼。

    __new__是建立一個對象,在類中先執行new方法,創造出一個對象,而後在把創造出來的對象傳遞給__init__方法。

    __call__爲了將一個類實例當作函數調用,咱們須要在類中實現__call__()方法

    __hash__哈希函數的結果就是__hash__方法的返回值,它在一次成的執行過程當中哈希值不會發生變化,而且要想做爲字典的key或者做爲集合的元素,這個對象對應的類必須實現__hash__方法。

#!/usr/bin/python # -*- encodeing:utf-8 -*- #del方法 # class A: # def __init__(self,name,age): # self.name = name # self.age = age # def __del__(self): # print('刪除時調用我') # a = A('Fang',25) # print(a) # del a # print(a) #new 方法 # class A: # def __init__(self): # print('執行init方法') # def __new__(cls): # print('執行new方法') # return object.__new__(cls) # a = A() # print(type(a)) # print(type(A)) # 先執行__new__方法 創造出一個對象 # 而後把創造出來的對象傳遞給__init__方法 # 會把self自動的返回,被a接收
class A: def __call__(self): print('執行call了') A()()

 

3、item系列

  item系列給出了三種方法,__getitem__、__setitem__、__delitem__,用於索引操做,如字典。以上分別表示獲取、設置、刪除數據

class A: def __init__(self,name): self.name = name self.age = 81
    def __getitem__(self, item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key] = value def __delitem__(self, key): del self.__dict__[key] a = A('alex') # print(a['name']) # 對應了類中一個方法的語法 # a.name # print(a['age']) # 對應了類中一個方法的語法 # a.age # 增長 和 修改一個屬性
a['sex'] = '不詳'
# a.sex = '不詳'
print(a.__dict__) # print(a.sex) # print(a['sex'])
a['sex'] = ''
print(a.__dict__) del a['sex'] print(a.__dict__)
相關文章
相關標籤/搜索