1. 程式人生 > >python的元類(metaclass)中attrs的使用

python的元類(metaclass)中attrs的使用

metaclass可以使用attrs檢視、修改子類的屬性

其中是class的屬性,不是(建立之後的,self.)物件的

可以從輸出carry在最後看到,Test定義之後馬上生成,而不是等到有語句。

self.d是不存在的,__init__也被看成屬性(attrs),然後也被pop了。

所以在pop完之後,元類的派生類只存在attrs指定的屬性。

其中,帶有self並且是第一個引數的屬於物件的屬性,否則是class的。

程式碼和例子:

class TestMetaclass(type):
        def __new__(cls, name, bases, attrs):
            mappings = dict()
            for k, v in attrs.items():
                print(k, v)
                mappings[k] = v
            for k in mappings.keys():
                attrs.pop(k)
            attrs['return_str'] = lambda self, p: '%s' % p
            attrs['c'] = 23
            return type.__new__(cls, name, bases, attrs)

class Test(object, metaclass = TestMetaclass):
        a = 'c'
        b = 1
        def __init__(self, d = 4):
            self.d = d

        def f(self, p):
            print(p)

print('carry')
t = Test()
print(t.return_str('fds'))
print(Test.c)
print(t.d)

結果:

[email protected]:~/Desktop$ python3 test.py 
__module__ __main__
__qualname__ Test
a c
b 1
__init__ <function Test.__init__ at 0x7fd83882aae8>
f <function Test.f at 0x7fd83882ab70>
carry
fds
23
Traceback (most recent call last):
  File "test.py", line 26, in <module>
    print(t.d)
AttributeError: 'Test' object has no attribute 'd'

相關推薦

pythonmetaclassattrs的使用

metaclass可以使用attrs檢視、修改子類的屬性 其中是class的屬性,不是(建立之後的,self.)物件的 可以從輸出carry在最後看到,Test定義之後馬上生成,而不是等到有語句。 self.d是不存在的,__init__也被看成屬性(attrs),然後

pythonmetaclass

優先 裝飾器 target {} pass get tac 搜索 items 認識python中元類的準備工作。 1,首先需要明白一個概念就是python中一切皆為對象。 input: class Trick(object): pass print type(‘1234

深刻理解Pythonmetaclass

1.類也是物件 在理解元類之前,你需要先掌握Python中的類。Python中類的概念借鑑於Smalltalk,這顯得有些奇特。在大多數程式語言中,類就是一組用來描述如何生成一個物件的程式碼段。在Python中這一點仍然成立: >>> class ObjectCreato

理解pythonmetaclass

本文是根據stackoverflow上關於“What are metaclasses in Python?”的回答翻譯總結而成的。原資料連線:https://stackoverflow.com/questions/100003/what-are-metaclasses-in-

Pythonmetaclass以及黑魔法__metaclass__

一、Python中的類 首先在這裡討論的python類,都是基於新式類進行討論。 在python中,一切皆為物件。 在理解元類之前我們先來重新理解一下python中的類。 class Joker: pass 當Python在執行帶clas

Python技巧:Metaclasses和利用Type構建的動態Dynamic Classes

`metaclass`和`type`關鍵字在Python程式碼中較少被使用(也正因如此,它們的作用也沒有很好的被理解)。在這篇文章中,我們將探究`type()`的型別(types)和跟`metaclasses`相關的`type`的用法。 這是我的型別麼?首先來看`ty

Python

bject class -1 div 所在 公開 nts 被調用 默認 一、類的重寫   對於父類的方法,只要它不符合子類模擬的實物的行為,都可對其進行重寫。為此,可在子類中定義一個這樣的方法,即它與要重寫的父類方法同名。這樣, Python將不會考慮這個父類方法,而只關註

python——tuple基本操作

name 逗號 print 一個個 gpo 類型 元組 多個 對象 元組被稱為只讀列表,數據可被查詢,但不能被修改,類似於列表的切片操作,元組寫在小括號裏面()元素之前用逗號隔開 對於一些不想被修改的數據,可以用元組來保存 # 創建元組 1)創建空元組 # 創建空元組

pythontuple

strong 第一個 class 返回 eve pos 位置 出現的次數 tro 元組tuple 元組一旦創建後便不可更改 表示方法: name1=("luo","gu","hu") 在一個元組中,可以是字符串,數字或混合型的 一、對於元組操作有以下函數: #1、cmp(n

class的已有屬性進行修改方法1

類有時,在類的編寫過程中,可能已經給了某個屬性一個默認值。在之後的使用過程中,我們或許需要更新這個值,可以用如下方法一,對默認值直接進行更新: eg:首先編寫好一個有關汽車的類,其中其中先定義了幾個汽車的初始化值,其中包含一個默認值,為它的公裏數: class Car(): #類的名字都需大寫,並要習慣用""

Pythonclass和例項(Instance)如何操作使用,

面向物件最重要的概念就是類(Class)和例項(Instance),必須牢記類是抽象的模板,比如Student類,而例項是根據類創建出來的一個個具體的“物件”,每個物件都擁有相同的方法,但各自的資料可能不同。 仍以Student類為例,在Python中,定義類

python Condition

del lap lose bdd 超時 實例 比較 sed ase Condition(條件變量)通常與一個鎖關聯。需要在多個Contidion中共享一個鎖時,可以傳遞一個Lock/RLock實例給構造方法,否則它將自己生成一個RLock實例。 不理解鎖的,請看上一條隨筆。

pythontuple的使用

一、元組基本使用 info_tuple = ("zhangsan", 18, 1.75, "zhangsan") # 1. 取值和取索引 print(info_tuple[0]) # 已經知道資料的內容,希望知道該資料在元組中的索引 print(info_tuple.index(

Python統計列表List的重複項出現的次數並進行排序

學習Python的過程中,你會遇到各種各樣的坑,不要覺得難,當你去踩過就會覺得很簡單了! 正文: 題目概述 對於一個列表,比如List = [1,2,3,4,5,3,2,1,4,5,

Python Tuples與列表List

       Python中Tuples和List都是Sequence資料型別的一種,不同的Tuples的值不能修改,但是我們可以通過拼湊來得到新的元組。          Tuples有個特別的就是在初始化含有0個或者1個元素的元組時,初始化0個元素的元組使用一對空括號(T

python 列表list自帶函式

呼叫help(list)獲得以下資訊: 把一些常用的發上來:  |  append(...)//把一個元素新增到最後  |      L.append(object) -- append object to end  |    |  count(...)//查詢一個元素

Python統計列表List的重復項出現的次數並進行排序

出現 iter 實現 found ict end val ever time 題目概述 對於一個列表,比如List = [1,2,3,4,5,3,2,1,4,5,6,4,2,3,4,6,2,2],現在我們需要統計這個列表中的重復項,統計出重復次數後,按照我們自己的要求進行排

python的資料型別——tuple

列表:打了激素的陣列 元組:帶了緊箍咒的列表;不可變資料型別,沒有增刪改查;可以儲存任意資料型別 元組的建立 In [1]: t = (1,1.2,True,'westos') In [2

利用python爬蟲技術動態爬取地理空間資料雲資料selenium

python爬取地理空間資料雲selenium動態點選 爬取的網址秀一下: 爬取的資訊是什麼呢? 這個資訊的爬取涉及到右邊按鈕的點選,這屬於動態爬取的範疇,需要用到selenium 好了,那麼開始寫程式碼吧 首先匯入selenium from seleni

使用Python進行層次聚——scipy層次聚的自定義距離度量問題

今天,總結一下如何使用層次聚類演算法裡面的自定義距離度量 層次聚類上次已經總結過。 這次僅僅說明層次聚類的距離引數,這裡的距離引數可以使用自定義函式。 我們進入該函式的文件頁面我們看到linkage的說明文件上面的函式scipy.cluster.hiera