類class
類定義
python中的類通過關鍵字class定義,類名以大寫字母開頭,并可以繼承已有類:
# Person類繼承object類
class Person(object) :
pass
# 使用Person()定義實例對象mike
mike = Person()
屬性賦值
實例屬性
class定義的實例包含不同的屬性,實例的屬性也可以被賦值為不同的屬性:
mike = Person()
mike.name = 'Mike'
mike.gender = 'Male'
mike.birth = '1998-1-1'
# 由于Python是動態語言,可以動態為實例添加屬性
mike.address = 'China'
實例屬性可以通過默認執行的init()函數進行初始化:
class Person(object) :
# __init__函數的第一個參數是留給指向外包的實例變量的,這里為了明確物理意義,用self指代實例自身,當然也可以用其他名稱
def __init__(self, name, gender, birth) :
self.name = name
self.gender = gender
self.birth = birth
# 在定義實例時,類的參數從第二個參數開始賦值
mike = Person(name, gender, birth)
類屬性
與實例屬性不同,類屬性是綁定在class類本身上的,對于一個class來說只有一份,對于不同的實例也只有一份,而實例屬性對于不同的實例可能是不同的:
# 定義類屬性
class Person(object) :
address = 'Earth' # 類屬性
def __init__(self, name) :
self.name = name # 實例屬性
# 通過類訪問類屬性
print(Person.address)
# 通過類定義的實例訪問類屬性
mike = Person()
print(mike.address)
由于類屬性只有一份,當類屬性被修改時,通過所有實例調用類屬性的返回值都會被改變。
當類屬性名和實例屬性名重復時,通過實例訪問該命名屬性會優先返回實例屬性,因為實例屬性優先級高于類屬性。
類屬性可以通過類訪問
類屬性的訪問權限限制
在類的屬性定義中,有些屬性是不希望被外部訪問的,通過在屬性名前加雙下劃線'__'表示該屬性不可被外部訪問:
# 命名前加雙下劃線的屬性不可被外部訪問
__attribute
# 前后都加雙下劃線的屬性被稱為特殊屬性,可以被外部訪問
__attribute__
# 前面加單下劃線的屬性可以被外部訪問,但是按照習慣,不應該被外部訪問
_attribute
定義方法
定義實例方法
定義實例的方法就是在類中定義函數,函數的第一個參數永遠是self,指向實例本身:
class Person(object) :
def __init__(self, name) :
self.__name = name
def get_name(self) :
return self.name
定義類方法
類方法與實例方法的關系類似于類屬性與實例屬性的關系,類方法綁定在類上,類方法也可以通過類或實例調用:
class Person(object):
__count = 0
@classmethod # 通過裝飾器classmethod裝飾類方法
def how_many(cls) :
return cls.__count
def __init__(self, name) :
self.name = name
Person.__count += 1
類繼承
class Person(object) :
def __init__(self, name, gender) :
self.name = name
self.gender = gender
class Student(Person) :
def __init__(self, name, gender, score) :
# 通過super()訪問Student繼承的類Person,并調用Person的__init__函數,如果不調用的話,Student會沒有Person的兩個屬性。
super(Student, self).__init__(name, gender)
self.score = score
類的多態
繼承類和父類的同名函數實現類的多態性,并且繼承類的函數優先級更高。
多重繼承
class A(B,C) :
pass
類的特殊方法
可以為自定義類定義特殊方法,相當于函數重載。
- str() :將類的實例變為str,并顯示給用戶。
- repr():將類的實例變為str,并顯示為開發人員。
- cmp():比較函數。如果輸入左值在前,返回-1,如果輸入右值在前,返回1。
- len():返回實例長度。
- add():加法。
- int(): 類型轉換為整數。
- float():類型轉換為浮點數。
- slot():建立一個允許在類中添加的屬性列表。
class Student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
- call():將一個類實例變為一個可調用對象。
@property裝飾器
@property裝飾器可以將函數重載為屬性,使得函數可以像屬性一樣被調用:
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
# @property為函數增加獲取屬性操作
@property
def score(self):
return self.__score
# @property的setter為函數增加賦值屬性操作
@score.setter # 在已經裝飾過的score上操作
def score(self, score):
if score < 0 or score > 100
raise ValueError('invalid score')
self.__score = score