Python 有没有一种方法可以使类本身的对象具有/模仿属性?

Python 有没有一种方法可以使类本身的对象具有/模仿属性?,python,python-3.x,Python,Python 3.x,我知道我可以设置对象本身的属性,但是,由于各种设计实现,这不起作用(我已经这样做了,它会更新其他属性,然后返回“self”,这样我就可以使用已经为该对象定义的方法) 我不知道这是否可能,但每次访问对象时启动构造函数也不太实际,因为有相当多的initiate,所以它实际上只适用于几个select属性 我可以简单地硬编码一个方法,在需要的地方重置所需的属性,但这会很麻烦 真正需要的是每次访问对象本身时自动调用一个方法,这样我就不必手动调用 为了举例说明我需要什么,我编写了一些伪代码。实际代码要复杂得

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

我不知道这是否可能,但每次访问对象时启动构造函数也不太实际,因为有相当多的initiate,所以它实际上只适用于几个select属性

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

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

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

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–指定

有sub1和sub2,它们是棒的子部分,因此具有不同的起点和终点。当调用它们时,属性将更新,并返回self,以便类的方法可以与更新的值一起使用

这一切都很好,但这里的问题是,无法将棒的起点和终点更改回最初启动对象时的原始长度

同样,这是伪代码。简单地设置一个名为“main”的属性(例如stick.main)不会真正起作用,因为对于实际代码来说,这太复杂了


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

实现这一点的最佳方法可能是创建一个“视图”类,该类允许您将子集视为透明的整个数据库/粘贴。它将拥有核心对象的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 = 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

如果愿意,可以将属性添加到
Stick
类中,该类返回特定的
SubStick
实例。这似乎是一个有点奇怪的API,但在实际代码中,它可能会以某种方式变得很方便,这在棍子类比中并不明显。

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

实现这一点的最佳方法可能是创建一个“视图”类,该类允许您将子集视为透明的整个数据库/粘贴。它将拥有核心对象的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 = 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

如果愿意,可以将属性添加到
Stick
类中,该类返回特定的
SubStick
实例。这似乎是一个有点奇怪的API,但在实际代码中,它可能会以某种方式变得很方便,这在棍棒类比中并不明显。

请以文本而不是图像的形式发布代码。图像肯定更清晰吗?在中复制和粘贴代码的格式不太好。@JimJam不适合使用屏幕阅读器的人。请使用文本。我们不需要颜色和斜体以及你的编辑器提供的任何其他突出显示。为什么格式不一样呢?所以,它有一个内置的代码荧光灯。但结果是这样的。类子单击:'@property def length(self):返回self.end-self.start'@property def sub2(self):self.start=25 self.end=50返回self'@property def sub1(self):请以文本形式发布代码,而不是图像。图像是否更清晰?在中复制和粘贴代码的格式不太好。@JimJam不适合使用屏幕阅读器的人。请使用文本。我们不需要颜色和斜体以及你的编辑器提供的任何其他突出显示。为什么格式不一样呢?所以,它有一个内置的代码荧光灯。但结果是这样的。类子单击:'@property def length(self):返回self.end-self.start'@property def sub2(self):self.start=25 self.end=50返回self'@property def sub1(self):啊,我明白了。您不会将内容本身传递给子条,而是传递引用原始条所需的信息以及子条本身的属性。这很聪明,我试图定义一个子类(主类内部的一个类),但是在外部使用一个会更好。谢谢:)那可能是个术语问题。在我的示例中,
SubStick
Stick
的子类(这意味着它继承了一些东西,比如
length
属性)。在另一个类中定义的类是另一回事,我可能称之为“嵌套”类。可以定义一个嵌套类,它也是一个子类,这仅仅是因为Python的类定义是如何工作的(当内部类尝试使用它时,基类的名称还没有定义)。您不会将内容本身传递给子条,而是传递引用原始条所需的信息以及子条的属性