![](/img/trans.png)
[英]How to access object atribute inside a list of objects that is an atribute of a class in 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.