簡體   English   中英

在Python中列出子實例的屬性

[英]List attributes of a sublass instance in Python

我正在嘗試在Python中建立一些“類似於ORM”的行為。 為此,我有一個Model類,並且想產生任何種類的子類。 我的問題是當我嘗試列出子類實例的屬性時。 這是我的Model類:

class Model:
    def __init__(self):
        self.className = type(self).__name__

    def listAttributes(self):
        from modules.users.user import User
        instance = User()
        meta = vars(instance)

和一個User子類:

class User(models.Model):
    name = models.FieldChar()
    password = models.FieldChar()
    age = models.FieldInteger()

當我從User實例調用listAttributes方法時,我沒有所期望的,但可能沒有我應有的: meta var僅包含className 這是我調用方法的方法:

from modules.users import user
user = user.User()
user.listAttributes()

當我在User()中重寫listAttributes方法時,行為相同:

def listAttributes(self):
    meta = vars(self)
    print(meta)

有沒有一種方法可以列出我調用listAttributes方法的對象的屬性?

謝謝你的燈!

您可以將listAttributes方法設置為類方法,然后嘗試以下操作:

class Model(object):
    @classmethod
    def listAttributes(cls):
        return [
            a for a in dir(cls) if not
            callable(getattr(cls, a)) and not 
            a.startswith("__")
        ]

如果您只想擁有屬於“字段”類型的屬性(FieldChar,FieldInt ...),則可以為名為ModelField的字段創建基類,並對照此基類型檢查屬性:

class Model(object):
    @classmethod
    def listAttributes(cls):
        attributes = []
        for a in dir(cls):
            if ((not callable(getattr(cls, a)) and not
                 a.startswith("__") and
                 getattr(cls, a).__class__.__bases__[0] == ModelField)):
                attributes.append(a)

您甚至可以返回對象而不只是名稱。 或將對象附加到Model類中的dict(以簡化代碼使用)。 我這樣構造我的ORM:

class ModelField(object):
    ...

class IntField(ModelField):
    ...

class Model(object):
    id = IntField(pk=True)

    def __init__(self, *args, **kwargs):
        try:
            self.modelFields
        except AttributeError:
            self.__class__.introspect()
        for key, modelfield in self.modelFields.items():
            setattr(self, key, kwargs.get(key, None))

    @classmethod
    def introspect(cls):
        cls.modelFields = {}
        for a in dir(cls):
            if ((not callable(getattr(cls, a)) and not
                 a.startswith("__") and
                 getattr(cls, a).__class__.__bases__[0] == ModelField)):
                cls.modelFields[a] = getattr(cls, a)

然后,我使用cls.introspect設置了modelFields字典,並使用該字典來例如自動生成數據庫表或通過使用ModelField類的屬性來構造查詢。

暫無
暫無

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

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