国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 舉例講解Python中metaclass元類的創(chuàng)建與使用

舉例講解Python中metaclass元類的創(chuàng)建與使用

2020-08-30 10:29cangmean Python

在Python中我們用type函數(shù)可以動態(tài)地創(chuàng)建一個元類,同樣也可以用__metaclass__屬性來指定一個元類,接下來我們就來具體舉例講解Python中metaclass元類的創(chuàng)建與使用

元類是可以讓你定義某些類是如何被創(chuàng)建的。從根本上說,賦予你如何創(chuàng)建類的控制權。
元類也是一個類,是一個type類。
 
元類一般用于創(chuàng)建類。在執(zhí)行類定義時,解釋器必須要知道這個類的正確的元類,如果此屬性沒有定義,它會向上查找父類中的__metaclass__屬性。如果還沒發(fā)現(xiàn),就查找全局變量。
 
對于傳統(tǒng)類來說,它們的元類是types.ClassType。
 
元類也有構造器,傳遞三個參數(shù):類名,從基類繼承數(shù)據(jù)的元組,和類屬性字典。
下面我們來定義一個元類,要求寫類的時候必須給類提供一個__str__()方法,如果沒有提供__repr__()方法,
則給你警告。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from warnings import warn
#元類需要繼承type類
class ReqStrSugRepr(type):
  def __init__(cls, name, bases, attrd):
  #構造函數(shù)需要傳遞的參數(shù)為類名,基類,類屬性字典
    super(ReqStrSugRepr, cls).__init__(name, bases, attrd)
    # 判斷__str__字符串是否在類的屬性字典里
    if '__str__' not in attrd:
      raise TypeError('Class requires overriding of __str__()')
 
    if '__repr__' not in attrd:
      warn('Class suggests overriding of __repr__()\n', stacklevel=3)
 
class Foo(object):
  #給類指定元類
  __metaclass__ = ReqStrSugRepr
 
  def foo(self):
    pass
#這一段代碼不用創(chuàng)建類來測試,直接運行一下就會報錯,可見元類的功力。

舉例講解Python中metaclass元類的創(chuàng)建與使用


type

type函數(shù)可以查看一個變量的類型, 比如:

?
1
2
3
4
# <type 'int'>
# <type 'str'>
type(1)    
type('mink')

type函數(shù)還可以創(chuàng)建一個新的對象
type接受三個參數(shù),name, bases, dict 第一個接受類名,第二個參數(shù)接受父類(元組形式),第三個參數(shù)接受屬性和方法(字典形式)

?
1
2
3
4
X = type('X', (object,), dict(a=1))
# 等于
class X(object):
  a = 1

下面是接受函數(shù)的方法

?
1
2
3
4
5
6
7
8
def say(self):
  print 'hello'
 
X = type('X', (object,), dict(say=say))
x = X()
 
# pirnt hello
x.say()

元類

我們都知道通過類可以創(chuàng)建處實例對象,而元類就是創(chuàng)建出類對象的類。type可以創(chuàng)建出類對象也就是說type就是一個元類。

metaclass 屬性

如果想使用元類創(chuàng)建類對象就需要對該對象添加一個__metaclass__屬性。當然你首先得有一個元類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class PrivateMetaclass(type):
  def __new__(cls, name, parents, attrs):
    attrs = dict(('__%s' % k, v) for k, v in attrs.itmes())
    return super(PrivateMetaclass, cls).__new__(cls, name, parents, attrs)
 
class A(object):
  __metaclass__ = PrivateMetaclass
  a = 1
  b = 2
 
a = A()
# raise AttributeError
print a.a, a.b
 
# print 1, 2
print a.__a, a.__b

這樣你就可以通過元類來修改類的一些特性,上面的就是修改變量為私有變量.

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 色综合视频在线 | 日本激情视频一区二区三区 | 深夜福利影院 | 日韩精品免费在线观看 | 亚洲一区二区 | 韩国av一区二区 | 国产日韩欧美在线 | 欧美专区在线观看 | 亚洲日韩中文字幕一区 | 久久国产精品久久久久久电车 | 亚洲一区二区精品在线观看 | 成人免费视频网址 | 91精品一区二区三区久久久久久 | 亚洲成人激情在线 | 日韩欧美中文字幕一区二区三区 | 伊人一区 | 日韩欧美国产一区二区 | 午夜精品视频在线观看 | 福利网在线 | 日韩一区二区三区在线 | 中文在线播放 | 四虎影院在线免费播放 | 欧美黄色网页 | 日韩电影免费在线观看中文字幕 | 美女搞黄网站 | 色爽| 毛片在线播放网站 | 亚洲欧美在线播放 | 久久综合久久综合久久 | 成人在线观看免费 | 亚洲 欧美 日韩 丝袜 另类 | 荷兰欧美一级毛片 | 欧美视频二区 | 亚洲欧美视频一区 | 久久精品久久久久久 | 亚洲五码中文字幕 | 午夜a级理论片915影院 | 日韩色网 | 免费的一级黄色片 | 伊人激情 | 天堂国产 |