一. 定義類 經典類:如果沒有直接或間接的子類化一個對象,也就是說如果沒有指定一個父類,或者是如果子類化的基本類沒有父類,那么就定義了經典類:
class A: pass新式類:如果你的類沒有繼承任何父類,object將作為默認的父類
class B(object): passPython 2.x中默認都是經典類,只有顯式繼承了object才是新式類 Python 3.x中默認都是新式類,不必顯式的繼承object 二. 定義類的屬性 1.1 直接在類里定義
class A(object): a=100在不做修改的情況下,所以這個類的對象的屬性都是一樣的 1.2 在構造函數里定義
class A(object): def __init__(self,a): self.a=100構造對象時把一些屬性的值傳進去,不同的對象可以有不同的屬性 2.訪問控制 python沒有訪問控制,沒有提供私有屬性的功能,在日常編程中通過一些編程規范和命名規則進行約束 前面加_表示私有屬性(只是一種編程規范,不是python語法的功能,仍然可以訪問到) 前面加__變相實現了部分私有屬性的訪問
class PRogramer(object): def__init__(self,weight): self.__weight=weight def get_weight(self): return self.__weightif __name__=='__main__': p=Programer(80) print(p.get_weight()) print(p._Programer__weight)#80#80三. 定義類的方法 方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬于類,區別在于調用方式不同。 普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self 類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類復制給cls 靜態方法:由類調用;無默認參數
class Foo: def __init__(self, name): self.name = name def ord_func(self): """ 定義普通方法,至少有一個self參數 """ # print self.name print '普通方法' @classmethod #類方法的裝飾器 def class_func(cls): """ 定義類方法,至少有一個cls參數 """ print '類方法' @staticmethod #靜態方法的裝飾器 def static_func(): """ 定義靜態方法 ,無默認參數""" print '靜態方法'# 調用普通方法,對象名調用f = Foo()f.ord_func()# 調用類方法,類名調用Foo.class_func() # 調用靜態方法,類名調用Foo.static_func()四. 類的繼承 繼承的子類會繼承父類的所有屬性,也可以自己定義,覆蓋父類的屬性和方法 對于面向對象的繼承來說,其實就是將多個類共有的方法提取到父類中,子類僅需繼承父類而不必一一實現每個方法 class 類名(要繼承的類): 如果不繼承類,則繼承object類,object類是所有類的父類
調用父類的方法: super(自己的類名,self).相應的方法名
多繼承: 1、Python的類可以繼承多個類,java和C#中則只能繼承一個類 2、Python的類如果繼承了多個類,那么其尋找方法的方式有兩種,分別是:深度優先和廣度優先 當類是經典類時,多繼承情況下,會按照深度優先方式查找 當類是新式類時,多繼承情況下,會按照廣度優先方式查找
新聞熱點
疑難解答