面向?qū)ο筮M(jìn)階

### 動(dòng)態(tài)添加屬性:

1. `對(duì)象.屬性名=xx`的形式。

2. 通過`setattr(對(duì)象,屬性名,這個(gè)屬性對(duì)應(yīng)的值)`來添加。

### 動(dòng)態(tài)添加實(shí)例方法:

使用`types.MethodType`來添加。并且這個(gè)函數(shù)中要有self作為第一個(gè)參數(shù)。

### 動(dòng)態(tài)添加類方法:

動(dòng)態(tài)添加類方法比較簡(jiǎn)單,直接將類對(duì)象添加一個(gè)屬性,指向一個(gè)函數(shù)就可以了。但是這個(gè)函數(shù)必須使用`@classmethod`來進(jìn)行裝飾。并且這個(gè)函數(shù)的第一個(gè)參數(shù)必須是`cls`。

### 動(dòng)態(tài)添加靜態(tài)方法:

動(dòng)態(tài)添加靜態(tài)方法也比較簡(jiǎn)單,直接將這個(gè)類對(duì)象添加一個(gè)屬性,并將這個(gè)屬性指向一個(gè)函數(shù)就可以了。但是這個(gè)函數(shù)必須使用`@staticmethod`來進(jìn)行裝飾。并且這個(gè)函數(shù)不需要傳遞`self`和`cls`這些參數(shù),因?yàn)樗皇且粋€(gè)靜態(tài)方法而已。

### 刪除屬性:

1. `del 對(duì)象.屬性名`。

2. `delattr(對(duì)象,屬性名)`

### `__slots__`魔術(shù)變量:

用來限制一個(gè)類中,只能添加指定的屬性。

這個(gè)魔術(shù)變量只能在新式類中才能用,在舊式類中不能使用。

### 類也是對(duì)象:

在Python中,一切皆為對(duì)象。包括類。類是使用元類創(chuàng)建的。

### 動(dòng)態(tài)的創(chuàng)建類:

使用`type`函數(shù)可以動(dòng)態(tài)創(chuàng)建類:`type(類名,父類的元組,這個(gè)類的屬性以及對(duì)應(yīng)值的字典)`

### 什么是元類:

元類總而言之一句話,就是用來創(chuàng)建類對(duì)象的。

### 創(chuàng)建自己的元類:

在`Python2`中,如果要指定這個(gè)類的元類,應(yīng)該修改`__metaclass__`魔術(shù)變量。

在`Python3`中,如果要指定這個(gè)類的元類,應(yīng)該在類定義的頭部,指定`metaclass=xxx`

1. 使用函數(shù)的形式:

? ? ```python

? ? # 元類會(huì)自動(dòng)將你通常傳給‘type’的參數(shù)作為自己的參數(shù)傳入

? ? def upper_attr(future_class_name, future_class_parents, future_class_attr):

? ? ? ? '''返回一個(gè)類對(duì)象,將屬性都轉(zhuǎn)為大寫形式'''

? ? ? ? # 選擇所有不以'__'開頭的屬性

? ? ? ? attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))

? ? ? ? # 將它們轉(zhuǎn)為大寫形式

? ? ? ? uppercase_attr = dict((name.upper(), value) for name, value in attrs)

? ? ? ? # 通過'type'來做類對(duì)象的創(chuàng)建

? ? ? ? return type(future_class_name, future_class_parents, uppercase_attr)

? ? ? ? class Foo(object):

? ? ? ? __metaclass__ = upper_attr

? ? ? ? bar = 'bip'

? ? ```

2. 使用類的形式:

? ? ```python

? ? class UpperAttrMetaclass(type):

? ? ? ? def __new__(cls, name, bases, dct):

? ? ? ? attrs = ((name, value) for name, value in dct.items() if not name.startswith('__'))

? ? ? ? uppercase_attr = dict((name.upper(), value) for name, value in attrs)

? ? ? ? return super(UpperAttrMetaclass, cls).__new__(cls, name, bases, uppercase_attr)

? ? ```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容