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
派生的类?还是还有另一个解决方案,可以使我可以将我的类方法作为属性处理。我的基本需求只是将它们作为属性处理,但是如果我也可以覆盖set
和delete
方法,那会更好。
更新:我意识到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__
。