簡體   English   中英

元類如何在 python 中工作?

[英]How Meta classes works in python?

問題的起源我最近使用 django 並習慣了模型、序列化器和表單中的 Meta 類。

到目前為止,我的理解是我知道元類用於創建類。

當定義一個類時,Python 將遍歷類內部並收集所有屬性和方法並存儲為字典,然后搜索__metaclass__屬性,如果已定義,它將使用該類創建已定義的類,否則將使用默認對象。 Object 是所有類都繼承的默認類,並且該對象類必須具有默認類型的__metaclass__

類型類具有用於創建類的__new____init__方法。


我的問題當我們在類的定義中聲明元類時創建類的流程是什么

例如

class Transformer(models.Model):
    name = models.CharField(max_length=150, unique=True)

    class Meta:
        ordering = ('name',)

何時何地使用這個Meta類?

編輯1:
清除了元類和 django Meta不同的一件事。
所以Meta只是 Transformer Model Class 的嵌套類。

問題:我的問題仍然是模型類如何使用這個Meta類?

Model Meta 基本上是模型類的內部類。 Model Meta 基本上用於更改模型字段的行為,例如更改順序選項、verbose_name_plural 和許多其他選項。 將 Meta 類添加到模型中是完全可選的。

例子:

class Category (models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True)

    def __str__(self):
    return self.name

    class Meta:
         verbose_name_plural= 'Categories' 

正如評論中所說:Python 元類與 django 元類不同:Django 只是出於歷史原因,對內部類使用相同的術語,其中一個注釋關於一個類的額外參數,外部類的主要成員是為了對應到模型或表單中的字段。

另一方面,Python 元類是您在示例中描述的內容,盡管您已經檢查了一些 Python 2 文檔。 在當前的 Python 中,元類是通過在新類的聲明中傳遞關鍵字參數“metaclas=”來確定的,基類所在的位置:

class MyClass(Base1, Base2, metclass=MyMeta):
   ...

據我所知,Django 行為起源於早期版本的 Django 實際上使用自定義(Python)元類來注釋現在在嵌套Meta中使用的一些參數 - 這樣做,它采用了定義的捷徑類主體內的元類內聯:不像通常的正常使用那樣將__metaclass__名稱分配給外部定義的元類,它只會就地定義類:從語言運行時的角度來看,它會找到名稱__metaclass__綁定到一個有效的元類並使用它來構建類。

后來的版本,即使在 Python 2 中,也修改了這種方法——內部類不再是模型或表單的實際“元類”(因為以前的方法顯然是矯枉過正)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM