欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python中內(nèi)置類型添加屬性問題詳解

 更新時間:2022年09月27日 10:28:04   作者:阿常囈語  
這篇文章主要介紹了python中內(nèi)置類型添加屬性問題詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

python中內(nèi)置類型添加屬性問題?

最近項目 進(jìn)行重構(gòu)一些代碼:

寫代碼過程中會遇到一個問題,我希望通過內(nèi)置類型生成的對象 添加屬性,但是添加總是失敗.

obj = object()
obj.name = 'frank'

報錯如下:

Traceback (most recent call last):
File input, line 2, in
AttributeError: 'object' object has no attribute 'name'

普通對象綁定屬性

我們知道python 語言的動態(tài)性, 是允許可以直接在是一個實例添加屬性的。

class Animal:
    def eat(self):
        pass
    def sleep(self):
        pass

在python console 里面運行,可以看到是可以正常添加屬性name

>>> animal = Animal()
>>> animal.name='dog'
>>> animal.name
'dog'

對比這兩個類的不同點:

class Animal(object):

    def __init__(self):
        # print(sorted(dir(self)))
        res = set(dir(self)) - set(dir(object))
        print(res)
        print('########' * 10)
        res = set(dir(object)) - set(dir(self))
        print(res)
        pass

結(jié)果如下:

{'__module__', '__weakref__', '__dict__'}
################################################
set()

發(fā)現(xiàn)self 多了三個魔術(shù)方法。 我們來重點關(guān)注 __dict__ 方法,我們知道一個對象的屬性,一般放在 這個屬性上面的。 但是object 的實例 沒有這個屬性。

def main():
    obj = object()
    try:
        print(obj.__dict__)
    except AttributeError as e:
        print("ERROR:", e)

    animal = Animal()
    print(animal.__dict__, type(animal.__dict__))

    animal.name = 'animal'
    animal.age = 10
    print(animal.__dict__)

結(jié)果如下:

在 animal 對象中, 屬性已經(jīng)存放在了 __dict__ 中。 而obj對象就沒有 __dict__ 這個屬性。

而我有一個大膽的想法,有沒有辦法可以直接在obj 實例上把 __dict__ 綁定到這個實例obj 上面呢?

在python console 里面嘗試下:

>>> obj = object()
>>> 
>>> obj.__dict__ = dict()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'
>>> setattr(obj,'__dict__',dict())
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'object' object has no attribute '__dict__'

發(fā)現(xiàn)并不能綁定成功,python 里面不允許這樣綁定。

在python中 所有內(nèi)置對象 list,dict,set ,object 等等,這些內(nèi)置對象,不允許在里面添加 屬性,方法等。

這樣做是一個不好的行為,一旦你對內(nèi)置對象做了修改,其他引用內(nèi)置對象的代碼,是否會受到影響呢 ? 這是一個不可預(yù)期的行為。

解決方法

比較好的做法:想綁定一個屬性 在一個對象上面。可以自定義一個類。然后綁定屬性,而不是在內(nèi)置類型生成的對象進(jìn)行綁定。

class Object(object):
    pass

>>> obj = Object()
>>> obj.__dict__
{}
>>> obj.name='frank'

>>> obj.__dict__
{'name': 'frank'}
>>> obj.name
'frank'

從網(wǎng)上找到一個解決方案在內(nèi)置類型上面可以添加方法 ,但是記得不要在生產(chǎn)環(huán)境這樣玩!

import ctypes
class PyObject(ctypes.Structure):
    class PyType(ctypes.Structure):
       pass

    ssize = ctypes.c_int64 if ctypes.sizeof(ctypes.c_void_p) == 8 else ctypes.c_int32
    _fields_ = [
        ('ob_refcnt', ssize),
        ('ob_type', ctypes.POINTER(PyType)),
    ]

def sign(klass, func_name):
    def _(function):
        class SlotsProxy(PyObject):
            _fields_ = [('dict', ctypes.POINTER(PyObject))]

        name, target = klass.__name__, klass.__dict__
        proxy_dict = SlotsProxy.from_address(id(target))
        namespace = {}
        ctypes.pythonapi.PyDict_SetItem(
            ctypes.py_object(namespace),
            ctypes.py_object(name),
            proxy_dict.dict,
        )
        namespace[name][func_name] = function

    return _
# method-1
@sign(list, 'mean')
def mean(l): return sum(l) / len(l)
#
#
@sign(list, 'max')
def mean(l): 
  return max(l)

# method-2
sign(list, 'mean')(lambda l: sum(l) / len(l)

總結(jié)

不要在python內(nèi)置對象上面添加方法和屬性。因為這種行為是不可預(yù)期的,最好的做法繼承內(nèi)置對象,在派生子類中添加屬性,方法等。

到此這篇關(guān)于python中內(nèi)置類型添加屬性問題詳解的文章就介紹到這了,更多相關(guān)python添加屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 最新Pygame zero最全集合

    最新Pygame zero最全集合

    這篇文章主要介紹了最新Pygame zero最全集合,通過本文學(xué)習(xí)知道update函數(shù)是pygame zero自帶的函數(shù),每秒運行60次,當(dāng)然也可以修改,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • pytorch自定義不可導(dǎo)激活函數(shù)的操作

    pytorch自定義不可導(dǎo)激活函數(shù)的操作

    這篇文章主要介紹了pytorch自定義不可導(dǎo)激活函數(shù)的操作,具有很好的參考價值,希望大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python中執(zhí)行smtplib失敗的處理方法

    python中執(zhí)行smtplib失敗的處理方法

    在本篇文章里小編給大家整理了關(guān)于python中執(zhí)行smtplib失敗的處理方法,對此有需要的朋友們可以學(xué)習(xí)下。
    2020-07-07
  • Python tkinter事件高級用法實例

    Python tkinter事件高級用法實例

    這篇文章主要介紹了Python tkinter事件高級用法,結(jié)合實例形式分析了Python使用tkinter模塊的事件響應(yīng)及圖形繪制相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • Python爬蟲基礎(chǔ)之XPath語法與lxml庫的用法詳解

    Python爬蟲基礎(chǔ)之XPath語法與lxml庫的用法詳解

    這篇文章主要給大家介紹了關(guān)于Python爬蟲基礎(chǔ)之XPath語法與lxml庫用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法

    Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法

    今天小編就為大家分享一篇Python將一個CSV文件里的數(shù)據(jù)追加到另一個CSV文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • python繪制多個曲線的折線圖

    python繪制多個曲線的折線圖

    這篇文章主要為大家詳細(xì)介紹了python繪制多個曲線的折線圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 自定義python日志文件系統(tǒng)實例

    自定義python日志文件系統(tǒng)實例

    這篇文章主要介紹了自定義python日志文件系統(tǒng)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python如何判斷文件存在方式

    python如何判斷文件存在方式

    這篇文章主要介紹了python判斷文件存在方式,判斷文件是否存在在實際應(yīng)用中用的非常多,下面我們來歸納一下檢查文件、文件夾是否存在的各種操作,需要的朋友可以參考下
    2022-09-09
  • Python中的Numpy?面向數(shù)組編程常見操作

    Python中的Numpy?面向數(shù)組編程常見操作

    這篇文章主要介紹了Python中的Numpy?面向數(shù)組編程常見操作,使用Numpy數(shù)組可以使你利用簡單的數(shù)組表達(dá)式完成多項數(shù)據(jù)操作任務(wù),而不需要編寫大量的循環(huán),這個極大的幫助了我們高效的解決問題
    2022-07-07

最新評論