首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种方法可以让类本身的对象具有/mimic属性?

有没有一种方法可以让类本身的对象具有/mimic属性?
EN

Stack Overflow用户
提问于 2020-03-07 02:06:35
回答 1查看 35关注 0票数 0

我知道我可以设置对象本身的属性,但是,由于各种设计实现,这不会起作用(我已经这样做了,它会更新其他属性,然后返回'self',这样我就可以使用已经为该对象定义的方法)。

我不知道这是否可能,但每次访问对象时初始化构造函数也是不切实际的,因为有相当多的initiate,所以它实际上只针对几个选择属性。

我可以简单地硬编码一个方法,在需要的时候在需要的地方重置所需的属性,但这会很麻烦。

真正需要的是在每次访问对象本身时自动调用一个方法,这样我就不必手动执行此操作。

为了举例说明我所需要的,我编写了一些伪代码。实际代码要复杂得多:

代码语言:javascript
复制
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,不会真正起作用,原因是相对于真正的代码来说太复杂了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-07 02:46:14

如果我理解正确的话,您有一个核心的数据位(一个数据库,但类似于问题中的一根棍子),并且您需要能够轻松地操作它的不同子集。

要做到这一点,最好的方法可能是创建一个"view“类,让您可以透明地将子集视为整个数据库/棒。它将拥有核心对象的API,但不会保存数据本身,而只是将内容转换为在构建它的主对象上工作。

它应该是这样的:

代码语言:javascript
复制
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对象:

代码语言:javascript
复制
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,但在实际代码中,它可能在某些方面很方便,这在棍子的类比中并不明显。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60569433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档