我知道我可以设置对象本身的属性,但是,由于各种设计实现,这不会起作用(我已经这样做了,它会更新其他属性,然后返回'self',这样我就可以使用已经为该对象定义的方法)。
我不知道这是否可能,但每次访问对象时初始化构造函数也是不切实际的,因为有相当多的initiate,所以它实际上只针对几个选择属性。
我可以简单地硬编码一个方法,在需要的时候在需要的地方重置所需的属性,但这会很麻烦。
真正需要的是在每次访问对象本身时自动调用一个方法,这样我就不必手动执行此操作。
为了举例说明我所需要的,我编写了一些伪代码。实际代码要复杂得多:
class Substick:
@property
def length(self):
return self.end - self.start
@property
def sub2(self):
self.start = 25
self.end = 50
return self
@property
def sub1(self):
self.start = 0
self.end = 67
return self
def quad(self, quadrant):
num = quadrant*(self.length)/4
return num
def half(self):
num = (self.length)/2
return num上面是类,叫做Stick。很简单,这个类是一根棍子(对象,但它也只是一个示例代码),长度为1-100。有两个方法,half和quad,half返回长度的一半,quad返回由参数象限-象限/4-指定的棍棒的cetain分数。
有sub1和sub2,它们是杆的子部分,因此具有不同的起点和终点。当它们被调用时,属性被更新,self被返回,这样类的方法就可以与更新后的值一起使用。
这一切都很好,但这里的问题是,没有办法将杆的起点和终点改回最初的长度,就像第一次初始化对象时一样。
同样,这是伪代码。简单地设置一个名为'main‘的属性,例如stick.main,不会真正起作用,原因是相对于真正的代码来说太复杂了。

发布于 2020-03-07 02:46:14
如果我理解正确的话,您有一个核心的数据位(一个数据库,但类似于问题中的一根棍子),并且您需要能够轻松地操作它的不同子集。
要做到这一点,最好的方法可能是创建一个"view“类,让您可以透明地将子集视为整个数据库/棒。它将拥有核心对象的API,但不会保存数据本身,而只是将内容转换为在构建它的主对象上工作。
它应该是这样的:
class Stick:
"""Class to hold some data."""
def __init__(self, data):
self.data = data
self.start = 0
self.end = len(data)
@property
def length(self):
return self.end - self.start
class SubStick(Stick):
"""Thin wrapper around a real Stick. SubStick's don't hold data themselves."""
def __init__(self, stick, start, end):
self.stick = stick
self.start = start
self.end = end
@property
def data(self):
return self.stick.data[self.start:self.end]现在,您可以使用与使用Stick相同的方式创建和使用Substick对象:
stick = Stick([1, 2, 3, 4])
print(stick.data, stick.length) # [1, 2, 3, 4] 4
s1 = SubStick(stick, 0, 2)
print(s1.data, s1.length) # [1, 2] 2
s2 = SubStick(stick, 2, 4)
print(s2.data, s2.length) # [3, 4] 2如果需要,可以向返回特定SubStick实例的Stick类添加属性。这似乎是一个有点奇怪的API,但在实际代码中,它可能在某些方面很方便,这在棍子的类比中并不明显。
https://stackoverflow.com/questions/60569433
复制相似问题