亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

python元類__metaclass

オリジナル 2016-11-05 14:14:34 406
サマリー:type 其實(shí)就是元類,type 是python 背后創(chuàng)建所有對(duì)象的元類 python 中的類的創(chuàng)建規(guī)則:假設(shè)創(chuàng)建Foo 這個(gè)類class Foo(Bar):   def __init__():     pass Foo中有__metaclass__這個(gè)屬性嗎?如果有,Python會(huì)在內(nèi)存中通過__metaclass__創(chuàng)建一個(gè)名字為Foo的類對(duì)象,他是一個(gè)

type 其實(shí)就是元類,type 是python 背后創(chuàng)建所有對(duì)象的元類

 python 中的類的創(chuàng)建規(guī)則:

假設(shè)創(chuàng)建Foo 這個(gè)類

class Foo(Bar):
  def __init__():
    pass

 Foo中有__metaclass__這個(gè)屬性嗎?如果有,Python會(huì)在內(nèi)存中通過__metaclass__創(chuàng)建一個(gè)名字為Foo的類對(duì)象,他是一個(gè)類,但是本身類就是對(duì)象,一個(gè)python文件模塊也屬于一個(gè)對(duì)象。

如果Python沒有找到__metaclass__,它會(huì)繼續(xù)在Bar(父類)中尋找__metaclass__屬性,并嘗試做和前面同樣的操作。

如果Python在任何父類中都找不到__metaclass__,它就會(huì)在模塊層次中去尋找__metaclass__,并嘗試做同樣的操作。

如果還是找不到__metaclass__,Python就會(huì)用內(nèi)置的type來創(chuàng)建這個(gè)類對(duì)象。

用途:元類的主要目的就是為了當(dāng)創(chuàng)建類時(shí)能夠自動(dòng)地改變類,元類的主要用途是創(chuàng)建API。一個(gè)典型的例子是Django ORM。它允許你像這樣定義:

Flask sqlalchemy ORM 類的定義也是通過繼承一個(gè)被創(chuàng)建的類Base, 并且要注意sqlalchemy 中所有的表類必須繼承一個(gè)Base 對(duì)象,不然繼承后創(chuàng)建的Base的表將無(wú)法實(shí)現(xiàn)ORM映射;

 sqlalchemy 實(shí)例: 

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class HotWordType(Base):
    # 表名稱
    __tablename__ = 'hotWordType'
    # id typeName
    id = Column(Integer, primary_key=True)  # 主鍵
    typeName = Column(String(20), nullable=False)  # 類型名
    hotWord = relationship('HotWord', backref='hotWordType')

declarative_base 中的元類源碼:

The new base class will be given a metaclass that produces
appropriate :class:`~sqlalchemy.schema.Table` objects and makes
the appropriate :func:`~sqlalchemy.orm.mapper` calls based on the
information provided declaratively in the class and any subclasses
of the class.

class DeclarativeMeta(type):
    def __init__(cls, classname, bases, dict_):
        if '_decl_class_registry' not in cls.__dict__:
            _as_declarative(cls, classname, cls.__dict__)
        type.__init__(cls, classname, bases, dict_)

    def __setattr__(cls, key, value):
        _add_attribute(cls, key, value)


手記を発表する

人気のある見出し語(yǔ)