繁体   English   中英

Python:如何从另一个属性的对象读取属性?

[英]Python: How to read an attribute from another atribute's object?

我什至不知道该如何寻找,这是一个简化的示例

我有一堂课:

class MyField():

    def __init__(self, model=None, source=None, id=None):
        self.source = source
        self.model = model
        self.id = id

    def somemethod(self):
        ...

这是在其他类上使用的

class MyClass(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    somefield = db.Column(db.String(255))

    @property
    def someproperty(self):

        specs = MyField(
            source=self.somefield,
            model=self.__class__.__name__,
            id=self.id
        )

        return specs.somemethod()

对我而言,这并不理想,我想为第二个类编写一些更简单的代码,因此使其看起来像这样:

class MyClass(db.Model):
    somefield = db.Column(db.String(255))

    someproperty = MyField(source='somefield')

并在第一类上具有处理该数据的所有逻辑。 在这里,我不知道如何读取“ somefield”和id的内容,“ somefield”可能会有所不同并有另一个名称,这就是为什么我将其用作参数,并且“ id”对于每个类都是相同的

所有这一切@property确实是返回一个自定义的描述 ,其__get__方法调用你的函数。 因此,您可以直接执行此操作。

我无法对此进行测试,因为我没有在此处安装sqlalchemy ,而是类似以下内容:

class FieldProperty(object):
    def __init__(self, field, source):
        self.field, self.source = field, source
    def __get__(self, obj, typ=None):
        if typ is None:
            typ = obj.__class__
        specs = self.field(
            source = getattr(obj, self.source),
            model = typ.__name__,
            id = obj.id)
        return specs.somemethod()

现在:

class MyClass(db.Model):
    somefield = db.Column(db.String(255))

    someproperty = FieldProperty(MyField, source='somefield')

或者,如果愿意,可以为所有字段创建基类或mixin,以添加为您执行此操作的类方法:

class BaseField(object):
    @classmethod
    def make_property(cls, source):
        return FieldProperty(cls, source)

现在:

class MyClass(db.Model):
    somefield = db.Column(db.String(255))

    someproperty = MyField.make_property('somefield')

请注意上面的FieldProperty(object) 描述符必须是新型类,并且只能在新型类中使用。 在Python 3.x中,已经有了新样式的类,但是如果使用2.x,则每次定义不带基类的类时,都会得到一个旧样式的类。 这只是您不希望使用老式类的众多原因之一; 他们还会处理一些错误的特殊方法,破坏多重继承,使您看起来像个复古潮人,然后潜入您的房间并在睡觉时从钱包中偷钱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM