一、方法
| 名稱 | 聲明 | 特點 | 調(diào)用 |
|---|---|---|---|
| 對象方法 | 直接聲明 | 自帶self參數(shù),指向當前對象 | 對象.方法() |
| 類方法 | 加@classmethod | 自帶cls參數(shù),指向當前類 | 類.方法() |
| 靜態(tài)方法 | 加@staticmethod | 沒有默認參數(shù) | 類.方法() |
使用:
需要對象屬性,聲明對象方法;
若不需,則看需要類字段,聲明類方法;
都不需,則聲明靜態(tài)方法
二、構造方法和__ init __方法
python中聲明類的時候系統(tǒng)會自動創(chuàng)建這個類對應的構造方法,構造方法內(nèi)會調(diào)用__ init __方法,用來對對象進行初始化, __ init __方法調(diào)用結束后,返回對象
def 與類名相同的構造方法(*args, **kwargs):
對象 = 創(chuàng)建對象
對象.__init__(*args, **kwargs)
return 對象
def __init__(self):
方法內(nèi)容
-
對象屬性
self.屬性名 = 值 -
類的字段
字段名 = 值
class Person:
# num就是類的字段
num = 6
# __slots__ = ('name', 'age')
# 在init方法中聲明對象屬性
def __init__(self, name, age):
self.name = name
self.age = age
注:(__ slots __魔法):約束當前類的對象最多能擁有幾個屬性,且會使對象的 __ dict __屬性失效
三、對象屬性的 增刪查改
I. 增
| 對象.屬性 = 值 | 添加屬性(屬性不存在時) |
|---|---|
| setattr(對象, 屬性名, 值) | 添加屬性(屬性不存在時,屬性名為str) |
II. 刪
| del 對象.屬性 | 刪除屬性 |
|---|---|
| delattr(對象, 屬性名) | 刪除屬性(屬性名為str) |
III. 查
| 對象.屬性 | 獲取對象指定屬性值(屬性必須存在) |
|---|---|
| getattr(對象, 屬性名, 默認值) | 獲取對象指定屬性值(屬性不存存在,返回默認值,且默認值必須賦值,屬性名為str) |
IV. 改
| 對象.屬性 = 值 | 修改屬性(屬性存在時) |
|---|---|
| setattr(對象, 屬性名, 值) | 修改屬性(屬性存在時,屬性名為str) |
四、內(nèi)置屬性
| 編號 | 表達式 | 功能 | 返回類型 |
|---|---|---|---|
| 1 | 對象.__ class __ | 獲取對象對應的類 | 類 |
| 2 | 類.__ name __ | 獲取類的名字 | 字符串 |
| 3 | 類.__ doc __ | 獲取類的說明文檔 | 字符串 |
| 4 | 對象.__ dict __ | 將對象轉換成字典(屬性:值) | 字典 |
| 5 | 類.__ module __ | 獲取當前類所在的模塊的模塊名 | 字符串 |
| 6 | 類.__ bases __ | 獲取當前類的父類 | 元祖 |
- 定制對象打印格式
def __repr__(self):
# return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))
# 結果:<__main__.Person object at 0x29c310>
return '<' + str(self.__dict__)[1:-1] + ' at ' + hex(id(self)) + '>'
五、私有化
python中在屬性或者方法名前加 __ ,就可以將屬性或者方法變成私有的
(注意:只能兩 __ 開頭,不能 __ 結尾)
私有的屬性和方法只能在類的內(nèi)部使用,不能在類的外面使用
原理:
在名字前是 __ 的屬性和方法前再加 ' _ 類名 ' 去保存屬性和方法
六、getter/setter
I. getter
第一步:聲明屬性的時候在屬性名前加 _
第二步:聲明函數(shù)(函數(shù)沒有除了self以外的參數(shù),但是要有返回值。返回值就是獲取屬性拿到的值)
第三步:在類的外部通過對象.去掉 _ 的屬性去獲取相關的屬性
格式:
@property
def 去掉_的屬性名(self):
做點別的事情
返回屬性的值
class Person:
def __init__(self):
self._week = 7 # 屬性名前有_,使用屬性的時候不要直接用
@property
def week(self):
if self._week < 7:
return '星期%d' % self._week
else:
return '星期天'
p1 = Person()
# 通過不帶_的屬性來獲取屬性的值實質(zhì)是在調(diào)用getter對應的函數(shù)
print(p1.week)
II. setter
(注:想要添加setter必須先要有getter)
第一步:聲明屬性的時候在屬性名前加_
第二步:聲明函數(shù)(函數(shù)除了self以外還需要一個參數(shù),沒有返回值。這兒的參數(shù)代表給屬性賦的值)
第三步:在類的外部通過對象.去掉_的屬性去給相關屬性賦值
格式:
@屬性名去掉 _ .setter
def 去掉 _ 的屬性名(self, 參數(shù)):
做點別的事情
給屬性賦值
class Person:
def __init__(self):
self._age = 0
@property
def age(self):
return self._age
# 給age添加setter
@age.setter
def age(self, value):
if not isinstance(value, int):
raise ValueError
if not (0 <= value <= 150):
raise ValueError
self._age = value
p1 = Person()
# 通過不帶_的屬性給屬性賦值實質(zhì)是在調(diào)用setter對應的函數(shù)
p1.age = 45
print(p1.age)