如何使用未从对象派生的类使用属性



i具有 django模型类(ps:model类是一个代表django结构中的数据库表的类。它们都来自 Model类)类。假设我将其属性设置如下:

class SomeModel(SomeClass):
    def __init__(self):
        self.x = 23
        self.y = 100
    def z(self):
        return self.x + self.y

在我的情况下,我不想将z作为一种方法处理,而呼叫则为SomeModel().z(),但作为属性,并将其称为SomeModel().z。此外,该属性不应更新或更改。在这种情况下,我将其定义为@property

class SomeModel(SomeClass):
    def __init__(self):
        self.x = 23
        self.y = 100
    @property
    def z(self):
        return self.x + self.y
    @z.setter
    def z(self, val):
        raise NotImplementedError

现在,我可以将SomeModel().z用作该类的属性。但是由于它不是从object派生的,因此@z.setter无法正常工作,我可以用

将值设置为z
some = SomeModel()
some.z
>> 123
some.z = 567
some.z
>> 567

是否有一种方法可以将@property用于未从object派生的类?还是还有另一个解决方案,可以使我可以将我的类方法作为属性处理。我的基本需求只是将它们作为属性处理,但是如果我也可以覆盖setdelete方法,那会更好。

更新:我意识到Model类是从object派生的,我可以按预期使用@property。因此相关的示例无效,我将它们更改一些。但是我的问题仍然有效,因为我也有一些 object的类。

如果要在旧类的子类中使用新的类样式,那么它的一种方法也只是子类对象。

class OldNonObjectClass:
    a, b = 2, 3
    @property
    def c(self):
        return self.b + self.a

class SubClass(OldNonObjectClass, object):
    x, y = 4, 5
    @property
    def z(self):
        return self.x + self.y
a = OldNonObjectClass()
print(a.c) 
#5
a.c = 2 
print(a.c)
#2 
b = SubClass()
print(b.z) 
#5
b.z = 2 
# AttributeError: can't set attribute

您可以使用多个继承也可以从object继承:class Subclass(ParentClass, object):

我从未尝试过用于属性,但它使super()起作用,所以我想它可以回答您的问题。

如果您不想使用它,也可以实现__getattr__

相关内容

最新更新