如何设计行为类似于根类的python类

陶瓷

编辑:

如回应中所述,此问题的搜索关键字是“ python中的赋值运算符重载”。

我想构造一个类,其行为类似于整数或字符串类。像这样的东西:

x = "hello"
x.upper() # says "HELLO"


y = MyClass()
y = 3
y = 5
print(y) # will print 5
y.previous_value() # will yield 3

我该如何建立一个像这样的类?

编辑:

目前最接近的黑客是这样的:https : //stackoverflow.com/a/6012807/1952991

轻量级

您无法实现此目的:

y = MyClass()
y = 3
y = 5
y.previous_value() # will yield 3

Python中的分配将名称重新绑定到另一个对象。这样做时y = 3y现在是整数3的名称,而不是的实例的名称MyClass此行为不依赖于旧RHS可言,而且不能被它而不拦截魔术(你能可能做上下文管理器的东西)。MyClass曾经用来引用的y实例不知道y不再引用它(或者它一开始就引用);即使这样做,y.previous_value()也会在int而不是MyClass实例上调用方法

您能做的最接近的是__setitem__当您执行以下操作时,这是Python调用的钩子:

x = [1, 2, 3]
x[2] = 5

第二行翻译为x.__setitem__(2, 5)使用此功能,您可以玩以下有趣的游戏:

class MyClass:
    def __init__(self):
        self.values = []

    def __setitem__(self, item, value):
        self.value.append(value)

    def previousvalue(self):
        return self.values[-2]

    def __str__(self):
        return str(self.values[-1])

x = MyClass()
x[:] = 5
x[:] = 6
print(x.previousvalue())

请注意,您需要[]到触发__setitem__,它需要有一个价值-它可以是任何对象,因为它被忽略,所以我用一个空切片。您需要跳过这样的句法箍圈这一事实应该是您应该重新考虑为什么要这样做的一个重要指标-几乎可以肯定,有一种更好的方法可以实现您的目标。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python类的行为类似于字典或列表数据

行为类似于@Entity和@Embeddable的类

行为类似于类字段的方法

如何制作行为类似于select Form元素的dropdown-menu和dropdown-toggle类

如何在行为类似于字典的自定义类中使用 += 操作?

从类中加载配置,使其行为类似于属性

如何使不是其抽象类的子类的接口实现者的行为类似于该接口的抽象类?

如何创建类似于C ++模板类的Java类?

如何在Python中对协变可变的类似于集合的类使用类型提示?

创建行为类似于stringstream的类的最简单方法

C#实现类,其行为类似于2dim数组

Kotlin密封类-如何按密封类排序类似于按枚举排序

类似于Java Duration的类的长度?

类似于“ if constexpr”,但用于类定义

Java。创建类似于List的新类

类似于Java Delphi的类引用

如何在C#中同时迭代两个非平凡的类对象的属性,类似于Python的zip方法

如何在Python中设计类?

我是否必须重载每个运算符,才能使类的行为类似于其成员变量之一?

如何在julia中创建行为类似于标准Java类并具有公共/私有字段和方法的“单一分发,面向对象的类”

如何设计DAO类?

如何设计类继承

如何在React with Typescript中的类组件中创建类似于setState的自定义钩子

如何将自定义格式器添加到类似于datetime的类中?

如何在打字稿中声明类似于类的外部库

如何在Scala中正确实现自定义的类似于数字的类?

如何在类中实现可选的类似于名称空间的功能?

xdotool:如何通过标题和具有不同模式的类搜索窗口(类似于AutoHotkey)

您可以在类主体中使用未实现的Java方法(类似于python pass)吗?