在对象中存储具有限制的值[英] Storing value with limits in object

问题描述

我正在尝试限制对象存储的值(int 或 float):

类限制(对象):
def __init__(self, value, min, max):
self.min, self.max = min, max
self.n = 价值
def set_n(self,value):
如果值 self.n = self.min
如果值为 self.max:
self.n = self.max
其他:
self.n = 价值
n = 属性(lambda self : self._value, set_n)

这行得通,除了我希望类表现得像内置类型,所以
我可以这样使用它:

a = 有限(7, 0, 10)
b = 数学.sin(a)

所以该对象本身返回它的值(存储在 a.n 中).这是
可能吗?

推荐答案

2008 年 6 月 22 日星期日上午 11:44,Josip <fa*******@noone.bewrote:
我正在尝试限制对象存储的值(int 或 float):

类限制(对象):
def __init__(self, value, min, max):
self.min, self.max = min, max
self.n = 价值
def set_n(self,value):
如果值 self.n = self.min
如果值为 self.max:
self.n = self.max
其他:
self.n = 价值
n = 属性(lambda self : self._value, set_n)

这行得通,除了我希望类表现得像内置类型,所以
我可以这样使用它:

a = 有限(7, 0, 10)
b = math.sin(a)

所以该对象本身返回它的值(存储在 a.n 中).这是
可能吗?
不是普通的 var,因为 = 是 Python 中的重新绑定运算符,
而不是赋值.

您可以使用对象属性执行(接近)上述操作.

大卫.

不是普通的变量,因为 = 是 Python 中的重新绑定运算符,
而不是赋值.

您可以使用对象属性执行(接近)上述操作.

大卫.
是的,但它是使用 int 和 float 等内置类型完成的.我怀疑我可以
从他们继承并实施限制,但我必须做出
每种类型的单独类.我可以覆盖 int() 之类的转换方法
和 float() 在我的课堂上?

2008 年 6 月 22 日星期日下午 12:24,Josip <fa*******@noone.写道:
>不适用于普通变量,因为 = 是 Python 中的重新绑定运算符,
而不是赋值.

您可以使用对象属性执行(接近)上述操作.

大卫.

是的,但它是使用 int 和 float 等内置类型完成的.我怀疑我可以
从他们继承并实施限制,但我必须做出
每种类型的单独类.我可以覆盖 int() 之类的转换方法
和 float() 在我的班级里?
我想我可能看错了你原来的帖子.

整数和浮点数是内部的、不可变的类型,有一些类
善在上面(所以你可以在一定程度上把它们当作物体对待,
它们的子类等).Python的解释器内置逻辑
哪个"知道"如何使用整数和浮点变量,而无需调用
他们特别的"__"方法.如果 Python 能正常工作,它会慢很多
这边.

要完全按照您的意愿行事,您需要添加一个新的内部数字
输入 Python.

您可以从 float 子类化,并重新定义 __float__ 和 __int__,但是
这些只会在您的代码实际调用内置函数时被调用
float() 和 int() 内置函数,例如:

导入数学

类浮动(浮动):
def __float__(self):
引发 NotImplementedError

a = 浮点数(1)
打印 math.sin(a)

# 输出 0.841470984808

a = 浮点数(1)
打印数学.sin(float(a))

# 抛出 NotImplementedError 异常

对象没有办法(afaik)告诉 Python 调用其中一个
它是获取对象的引用或"值"的方法(如果有
是,它会让事情变得非常复杂).在 Python 中你一般
需要更新查找期间使用的逻辑以获得该效果(即,
在 a.b.c 中,你可以自定义 a.b 查找,或者 a.b.c 查找,但是
不是查找本身).

理论上你可以破解 Python 的内部局部变量或全局变量
字典,以便它在查找您的
时做了一些不寻常的事情目的.但实际上这不起作用,因为返回的
对象(当您调用 globals() 或 locals() 时)属性是只读的.
可能是因为那些内部查找字典是在
中实现的优化了 C 而不是 Python,C 实现不允许你
通过 Python 接口重新定义它的内部结构.

大卫.

本文地址:https://www.itbaoku.cn/post/1050832.html