結構python
classs 類名:函數
類體oop
__init__
函數, __init__ 並不會建立對象,但會初始化對象例子:this
1 class E: 2 NAME = 'E' # 類的直接下級做用域 叫作類變量 3 4 def __init__(self, name): 5 self.name = name # 關聯到實例的變量 叫作實例變量
__dict__ :當經過對象動態增長屬性的時候,若是存在此屬性,會覆蓋原屬性,不存在會存放到對象.__dict__中。
spa
__class__ : 若是經過類名.類屬性方式給類屬性從新賦值,原類屬性會被覆蓋
代理
--------------------------------------------------- 只須要對象.__dict__ 來看其內容能分辨----------------------------------------------------------------------------- code
類裝飾器一般用於給類增長屬性-- 方法都是類級的對象
方法的定義都是類級的,可是有的方法使用實例調用,有的方法使用類來調用blog
class I: def print(self): print('instance method') @classmethod # 當一個方法,被classmethod裝飾的時候, 第一個參數會變成類自己, 這樣的方法叫類方法 def class_print(cls): print(id(cls)) print('class method') @staticmethod # 當一個方法, 被staticmethod裝飾的時候,不會自動傳遞第一個參數, 這樣的方法叫靜態方法 def static_print(): print('static method') def xxx_print(): print('this is a function')
實例方法只能由實例調用繼承
class Door: def __init__(self, number, status): self.number = number self.__status = status # 雙下劃線開始, 非雙下劃綫結尾的都是私有的, 在類外部沒法訪問 def open(self): # 方法 self.__status = 'opening' def close(self): self.__status = 'closed' def status(self): return self.__status def __set_number(self, number): # 雙下滑先開始, 非雙下劃線結尾的方法也是私有方法 self.number = number
全部雙下劃線開始,非雙下劃線結尾的成員,都是私有成員
私有成員在類外部沒法訪問
Python的私有成員是經過更名實現的,_類名 + 帶雙下劃綫的屬性 在__dict__ 中會有標識(python中沒有真正的私有成員,但這能夠忽略不計)
部分代碼中 用單下劃線標註的變量能夠理解爲內部變量,不但願在外部繼續調用(其實外部能夠調用),解釋器不不作任何處理
雙下劃線開始,非雙下劃線結尾的方法是私有方法。
若是用 @property 裝飾器會把一個僅有self參數的函數,變成一個屬性, 屬性的值,爲方法的返回值
class Door: def __init__(self, status): self.__status = status # 雙下劃線開始, 非雙下劃綫結尾的都是私有的, 在類外部沒法訪問 @property # property 裝飾器會把一個僅有self參數的函數,變成一個屬性, 屬性的值,爲方法的返回值 def status(self): return self.__status
d = Door('opening') print(d.status) status 爲 Door 中 status方法
super(父類, self).print() # 代理 TYPE 的父類的方法, 而且使用 obj 綁定 第一個參數 指定調用誰的直接父類, 第二個參數指定當調用時,傳遞什麼做爲方法的第一個參數
class Base: def __init__(self, a, b): self.__a = a self.__b = b def sum(self): return self.__a + self.__b
class Sub(Base): def __init__(self, a, b, c): self.c = c # self.__a = a # self.__b = b super().__init__(a, b)
super 對象只能獲取類的屬性