Python 內置方法和屬性應用:反射和單例

2021-03-02 Python中文社區

類的屬性我們來看下一個類的申明,如下:

class Foo():
    """this is test class"""
    def __init__(self, name):
        self.name = name
    
    def run(self):
        print('running')

# 列出類的所有成員和屬性
dir(Foo)
['__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'run']


# 類的注釋
Foo.__doc__
# 'this is test class'

# 類自定義屬性
Foo.__dict__
mappingproxy({'__module__': '__main__',
          '__doc__': 'this is test class',
          '__init__': <function __main__.Foo.__init__(self, name)>,
          'run': <function __main__.Foo.run(self)>,
          '__dict__': <attribute '__dict__' of 'Foo' objects>,
          '__weakref__': <attribute '__weakref__' of 'Foo' objects>})

# 類的父類
Foo.__base__

# 類的名字
Foo.__name__

類的實例化和初始化

# python類先通過__new__實例化,再調用__init__進行初始化類成員
foo = Foo('milk')

類的屬性添加和訪問

# 類的訪問
foo.name
foo.run()

# 可以通過setattr 動態的添加屬性
def method():
    print("cow")

setattr(foo, "type", "cow")
setattr(foo, "getcow", method)
# cow
foo.type
foo.getcow()

# 動態刪除屬性 delattr
delattr(foo, "type")

# getattr 獲取成員屬性
if hasattr(foo, "run"): # 判斷是否有屬性
    func = getattr(foo, "run")
    func()

相關焦點

  • 從Python對象的內建屬性和方法談Python的自省和反射機制
    從dir()函數說起對於dir()這個Python的內置函數,Python進階群裡的小夥伴們一定不陌生。我不止一次地介紹過這個函數。每當想要了解一個類或類實例包含了什麼屬性和方法時,我都會求助於這個函數。
  • 面試必問的「單例模式」究竟是什麼鬼?有哪些優缺點和實現方式
    很多面試python初級崗位的同學,有大概率會被問到單例模式,而且一般都會現場讓你寫一個單例。可是有很多同學可能不是很理解,甚至專門把代碼背下來,說實話,有點不靠譜。一般開始都有個默認值,如果完成了,將默認值更改,如果沒完成,繼續執行單例也是為了達到這個目的,允許你在程序的任何地方訪問這個對象,且提供了更為全面的屬性和方法,讓你可以在設計類時,完美地實現這個特殊的"全局變量"。
  • Python的私有化屬性
    _age = "年齡" # 受保護的屬性(proteced),類裡面或者是子類中可以訪問該變量 self.__salary = "工資" # 私有變量, 只能在當前類裡面訪問 print(self.
  • Java單例模式深入詳解
    一.問題引入偶然想想到的如果把Java的構造方法弄成private,那裡面的成員屬性是不是只有通過static來訪問呢;如果構造方法是private的話,那麼有什麼好處呢;如果構造方法是private的話,會不更好的封裝該內呢?我主要是應用在使用普通類模擬枚舉類型裡,後來發現這就是傳說中的單例模式。
  • Python安裝教程和使用技巧
    具有可移植性,支持面向過程和面向對象編程,並且開源。window系統中,python有多種開發工具,例如1.直接在cmd命令窗口執行,但此種僅能單條語句執行,不能運行完整的程序。2.python自帶的集成開發環境,可通過開始——所有程序——python3.3——IDLE(Python GUI)啟動。
  • 柳小白Python學習筆記 10 內置方法之列表方法
    python3.7幫助文檔中是這樣定義方法的:方法是使用屬性表示法來調用的函數。 存在兩種形式:內置方法和類實例方法。 內置方法由支持它們的類型來描述。前面學習數據類型的時候學習了許多方法,我看不懂英文幫助文檔,而查了好多資料都是說類實例方法的,說方法是定義在類中的函數。但是學習的時候感覺這些方法沒在類中定義呀,很疑惑。
  • Python 69個內置函數分8類總結,這樣記更方便!
    setattr(object, name, value) #為對象設置屬性delattr(object, name) # 刪除命名的屬性getattr(object,name) #獲取屬性的取值,如果對象無此屬性,會拋異常getattr(object,name, 123) #即便無此屬性,也不會拋異常,會返回123hasattr(object,name
  • python 類(3) 私有屬性/方法
    慢慢努力吧內容提要類中的__變量python中,在類的定義中在變量名前加雙下劃線的變量,稱為類的私有屬性,其本意是不讓類的實例訪問變量class MyClass(object): def __init__(self): self.
  • 深入理解Python 類型和對象
    本書例子適用於Python 2.5 及以上,包括 Python 3.x. 本書不是為完全初學者寫的. 而是針對已經對Python有所了解 (稍稍了解即可) 並希望對它了解更多的人. 本書為掌握新式(new-style)屬性訪問及descriptors, properties等機制提供了所需的底層的要點。
  • Python 內置函數總結(2/4)
    官網: https://docs.python.org/3.6/library/functions.html可以看官網英文描述,解釋和例子還是看小編公眾號吧畢竟一段文字沒有例子總是看著很費勁比如Ast是python源碼到字節碼的一種中間產物,藉助ast模塊可以從語法樹的角度分析源碼結構。此外,我們不僅可以修改和執行語法樹,還可以將Source生成的語法樹unparse成python源碼。
  • Python類的概念、定義、屬性、繼承
    .查看類中的屬性和實例屬性可以調用__dict__方法返回屬性組成的字典。') self.name = name self.food = food def get_name(self): print(self.name) 5.類的私有屬性和方法 在Python中,通過單下劃線」_」來實現模塊級別的私有化,一般約定以單下劃線」_」開頭的變量
  • Python 和 Ruby 的對比
    他的基本的數據類型和運算符都是可以重載的。ruby主要的功能都是通過對象的方法調用來實現的,而不是函數。python也在向這方面發展,但沒有ruby做的徹底。ruby的類是更規範的單繼承,還有接口等概念的實現。python可以實現在列表內的條件語句、循環語句,而ruby用「塊」的方式來實現這個功能,比python的更靈活,更具有通用性。
  • Python中類和類的實例化、私有屬性面,以及面向對象的三大屬性
    如果要從新修改類屬性,以上代碼為列,可以用從新賦值的方法進行操作,即:dog.eye=4,這樣就完成了從新賦值的修改操作。3.私有化對於Python中的類屬性,可以通過雙下劃線」__」來實現一定程度的私有化。「 _」和「 __」的使用 更多的是一種規範/約定,沒有真正達到限制的目的。「_」:以單下劃線開頭只能允許其本身與子類進行訪問,(起到一個保護的作用)。
  • python計算平方和平方根的方法
    前言從小學我們就學習了平方和開平方運算。平方是一種運算,比如,a的平方表示a×a,簡寫成a,也可寫成a×a(a的一次方乘a的一次方等於a的2次方),例如4×4=16,8×8=64,平方符號為2。python如何計算平方和平方根在python中,有多種方法可以求一個數的平方和平方根,可以使用:內置模塊、表達式、內置函數等實現。
  • 什麼是python單例模式,看完你就知道了
    1、什麼是單例模式讓所有類在實例化時,指向同一個內存地址,稱之為單例模式 PS:無論產生多少個對象,都會指向 單個 實例當在確定 "類中的屬性與方法不變" 需要反覆調用類時,會產生不同的對象,也會產生不同的內存地址,最終造成資源的浪費
  • Python生成器next方法和send方法區別詳解
    1.和傳統的容器相比,生成器更節省內存. 2.延遲計算,在我們需要結果時就調用一下生成器的next()方法即可. 3.可迭代,你可以像遍歷list一樣,遍歷生成器 三.如何創建生成器?本文是<Effect Python 編寫高質量Python代碼的59個有效方法>的學習筆記.主要記錄生成器的使用方法和示例代碼.
  • Python中有哪些內置函數呢?以及內置函數實例
    >Python中有哪些內置函數呢?高級內置函數enumerate 返回一個可以枚舉的對象eval 取出 字符串中的內容,將字符串str當成有效的表達式來求指並返回計算結果exec 執行字符串或complie方法編譯過的字符串
  • 反射、元數據和動態編程
    Inherited 設置為True 時,表示應用到類、接口、方法或屬性等自動應用到派生類,接口或者重寫的方法或屬性版本上3、反射主要應用與類庫,這些類庫需要知道一個類型的定義,以便提供更多的功能。應用要點:1、現實應用程式中很少有應用程式需要使用反射類型2、使用反射動態綁定需要犧牲性能3、有些元數據信息是不能通過反射獲取的4、某些反射類型是專門為那些clr 開發編譯器的開發使用的,所以你要意識到不是所有的反射類型都是適合每個人的
  • 設計模式一:單例模式
    什麼是單例模式單例模式是指系統中的某個類只能有一個對象實例。
  • 強大的反射功能詳解與應用源碼解析
    反射是Java提供的一個靈活又強大的功能。通過Java反射,能夠在類的運行過程中知道這個類有哪些屬性和方法,還可以修改屬性、調用方法、建立類的實例。說起來可能有些不好理解。假設我們有一個代碼所示的類。" + entry.getKey() + "; 變化為:" + entry.getValue());}圖 程序運行結果基於反射的diffObj方法完成了User和Book兩個完全不同類的對象屬性對比工作。