最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

報(bào)錯(cuò)如下:

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

普通對(duì)象綁定屬性

我們知道python 語(yǔ)言的動(dòng)態(tài)性, 是允許可以直接在是一個(gè)實(shí)例添加屬性的。

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

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

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

對(duì)比這兩個(gè)類的不同點(diǎn):

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 多了三個(gè)魔術(shù)方法。 我們來(lái)重點(diǎn)關(guān)注 __dict__ 方法,我們知道一個(gè)對(duì)象的屬性,一般放在 這個(gè)屬性上面的。 但是object 的實(shí)例 沒(méi)有這個(gè)屬性。

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 對(duì)象中, 屬性已經(jīng)存放在了 __dict__ 中。 而obj對(duì)象就沒(méi)有 __dict__ 這個(gè)屬性。

而我有一個(gè)大膽的想法,有沒(méi)有辦法可以直接在obj 實(shí)例上把 __dict__ 綁定到這個(gè)實(shí)例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)置對(duì)象 list,dict,set ,object 等等,這些內(nèi)置對(duì)象,不允許在里面添加 屬性,方法等。

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

解決方法

比較好的做法:想綁定一個(gè)屬性 在一個(gè)對(duì)象上面??梢宰远x一個(gè)類。然后綁定屬性,而不是在內(nèi)置類型生成的對(duì)象進(jìn)行綁定。

class Object(object):
    pass

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

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

從網(wǎng)上找到一個(gè)解決方案在內(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)置對(duì)象上面添加方法和屬性。因?yàn)檫@種行為是不可預(yù)期的,最好的做法繼承內(nèi)置對(duì)象,在派生子類中添加屬性,方法等。

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

相關(guān)文章

  • pycharm修改文件的默認(rèn)打開(kāi)方式的步驟

    pycharm修改文件的默認(rèn)打開(kāi)方式的步驟

    在本篇文章里小編給大家整理了關(guān)于pycharm修改文件的默認(rèn)打開(kāi)方式的步驟以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-07-07
  • Django異步任務(wù)之Celery的基本使用

    Django異步任務(wù)之Celery的基本使用

    這篇文章主要給大家介紹了關(guān)于Django異步任務(wù)之Celery使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • python命令行執(zhí)行方法及技巧分享

    python命令行執(zhí)行方法及技巧分享

    這篇文章主要介紹了Python編程中使用命令行工具的基本操作和進(jìn)階技巧,通過(guò)編寫(xiě)Python腳本,理解Python解釋器,以及在命令行中執(zhí)行腳本,可以實(shí)現(xiàn)數(shù)據(jù)處理和系統(tǒng)任務(wù)的自動(dòng)化,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • python實(shí)現(xiàn)錄制全屏和選擇區(qū)域錄屏功能

    python實(shí)現(xiàn)錄制全屏和選擇區(qū)域錄屏功能

    這篇文章主要介紹了python實(shí)現(xiàn)錄制全屏和選擇區(qū)域錄屏功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python函數(shù)式編程藝術(shù)之修飾器運(yùn)用場(chǎng)景探索

    Python函數(shù)式編程藝術(shù)之修飾器運(yùn)用場(chǎng)景探索

    本文將詳細(xì)介紹Python修飾器的概念,提供詳細(xì)的示例,并介紹如何使用它們來(lái)優(yōu)化和擴(kuò)展代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • pygame學(xué)習(xí)筆記(4):聲音控制

    pygame學(xué)習(xí)筆記(4):聲音控制

    這篇文章主要介紹了pygame學(xué)習(xí)筆記(4):聲音控制,本文講解了pygame.mixer啟動(dòng)與初始化、播放聲音片段wav文件、播放mp3、wma、ogg音樂(lè)文件、控制音量、制作mp3播放器中遇到的問(wèn)題等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python實(shí)現(xiàn)批量合并圖片到word文檔

    Python實(shí)現(xiàn)批量合并圖片到word文檔

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)批量合并指定文件夾中的所有圖片并插入到Word文檔中并保存,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • 11個(gè)并不被常用但對(duì)開(kāi)發(fā)非常有幫助的Python庫(kù)

    11個(gè)并不被常用但對(duì)開(kāi)發(fā)非常有幫助的Python庫(kù)

    這篇文章主要介紹了11個(gè)并不被常用但對(duì)開(kāi)發(fā)非常有幫助的Python庫(kù),這些庫(kù)大都被放在Github上開(kāi)源、并且經(jīng)過(guò)一段時(shí)間的編寫(xiě)和維護(hù),對(duì)Python開(kāi)發(fā)有一定的幫助,需要的朋友可以參考下
    2015-03-03
  • python的else子句使用指南

    python的else子句使用指南

    本文討論P(yáng)ython的for…else和while…else語(yǔ)法,這是Python中最不常用、最為誤解的語(yǔ)法特性之一
    2016-02-02
  • Tensorflow 卷積的梯度反向傳播過(guò)程

    Tensorflow 卷積的梯度反向傳播過(guò)程

    今天小編就為大家分享一篇Tensorflow 卷積的梯度反向傳播過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02

最新評(píng)論

开原市| 鸡西市| 滨州市| 黎川县| 兴国县| 武安市| 潞西市| 当阳市| 东明县| 九龙县| 林甸县| 桃江县| 四川省| 司法| 江山市| 元朗区| 沙洋县| 内乡县| 无极县| 东乡| 林西县| 东丰县| 池州市| 三门峡市| 水城县| 孝昌县| 斗六市| 色达县| 颍上县| 临朐县| 荥阳市| 正定县| 墨脱县| 阳谷县| 广州市| 中超| 南城县| 新营市| 涪陵区| 商河县| 山丹县|