python基础-类
實例屬性和類屬性
類中,沒有self指定的是類屬性,有self指定的是實例屬性。類中的方法是類屬性。
類和實例都是名字空間。類是類屬性的名字空間,實例時實例屬性的名字空間。
可以通過類訪問類屬性,通過實例訪問實例屬性。如果實例沒有同名屬性的話,也可以通過實例訪問類屬性。
比如類C,有version屬性,可以通過類訪問:C.version。創建實例c后,實際上訪問c.version會失敗,但是,會首先在實例中搜索version,然后在類中搜索,再到繼承樹中的基類。
訪問類屬性
class C(object):version = 1.2 # 類屬性 c=C() C.version # 通過類訪問類屬性 c.version # 通過實例訪問類屬性類屬性為不可變對象,通過實例訪問類屬性
C.version += 1 # 通過類更改類屬性 c.version = 1 # 不能通過實例更改類屬性,這樣會創建一個實例屬性 c.version += 1 # 為2.2,以類屬性的值創建實例屬性,等于c.version = C.version + 1類屬性為可變對象,通過實例訪問類屬性
class Foo(object):x=foo = Foo() foo.x # {2003:'poe2'}foo.x[2004] = 'valid path' foo.x # {2003:'poe2', 2004:'valid path'}Foo.x # {2003:'poe2', 2004:'valid path'} 通過實例修改了類屬性del foo.x # 失敗類屬性持久化
通過實例屬性類修改類屬性很危險。
類屬性是靜態成員,類屬性的修改會影響所有實例。
綁定和方法調用
方法是類內部定義的函數,方法是類屬性不是實例屬性。綁定主要與方法調用有關。
方法只有在類擁有實例時,才能被調用。存在一個實例時,方法才認為是綁定到哪個實例,沒有實例時就是未綁定的。
方法有self參數,用于引用方法所綁定的實例。
調用綁定方法
有一個MyClass類,帶self參數的foo方法,實例mc。通過實例調用方法就是調用綁定方法,mc.foo()。
調用非綁定方法
調用一個還沒有任何實例的類中的方法,也就是通過類調用類方法。需要明確的傳遞self參數。場景:派生一個子類,并且覆蓋父類的方法,需要調用父類中的方法。
靜態方法和類方法
python靜態方法特性之前,通過在全局名字空間創建函數替代。
通常方法需要self參數,綁定方法調用時,自動傳遞。對于類方法,需要的是類,通常名為cls,自動傳遞給類方法。
staticmethod()和classmethod()內建函數
經典類中使用靜態方法和類方法
class TestStaticMethod:def foo():print 'calling static method foo()'foo = staticmethod(foo)class TestClassMethod:def foo(cls):print 'calling class method foo()'foo = classmethod(foo)tsm = TestStaticMethod() TestStaticMethod.foo() # 通過類調用 tsm.foo() # 通過實例調用 tcm = TestClassMethod() TestClassMethod.foo() # 通過類調用 tcm.foo() #通過實例調用使用函數修飾符
class TestStaticMethod:@staticmethoddef foo():print 'calling static method foo()' class TestClassMethod:@classmethoddef foo(cls):print 'calling class method foo()'組合
大的類包含其他小類的實例,類之間顯著不同,小類是大的類所需要的組件。
class P:'P class'def __init__(self):print 'created an instance of ', self.__class__.__name__ class C(P):passp=P() # 父類實例 p.__class__ P.__bases__ p.__doc__c = C() c.__class__ C.__bases__ C.__doc__ #文檔字符串不能繼承父類總結
以上是生活随笔為你收集整理的python基础-类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web页面获取用户控件页面中服务器控件的
- 下一篇: HashCode和hashMap、has