我有一个类Point
,它接受位置,值和标志作为参数。此类应仅接受整数作为位置和值参数。我尝试了下面的代码,但它无法正常工作。
class PointException(Exception):
pass
class Point():
def __init__(self, position, value, flag=False):
try:
if all([isinstance(x, int) for x in position, value]):
self.position = position
self.value = value
self.point = (position, value)
self.flag = flag
except:
raise PointException("Foo value and position must be integers.")
def __repr__(self):
return "< {0}, {1}, {2} >".format(self.position, self.value, self.flag)
def __eq__(self, other):
if not isinstance(other, Point):
return False
try:
return all([self.point == other.point, self.flag == other.flag])
except AttributeError:
return False
def __ne__(self, other):
return not self.__eq__(other)
更新
例如,当我尝试AttributError
时,我得到Point(1, 1.2)
。
AttributeError: Point instance has no attribute 'position'
答案 0 :(得分:3)
if all([isinstance(x, int) for x in position, value])
应该是
if all(isinstance(x, int) for x in (position, value))
更一般地说,您必须在raise
中__init__
例外,而不是except
:
def __init__(self, position, value, flag=False):
if not all(isinstance(x, int) for x in (position, value)):
raise PointException("Foo value and position must be integers.")
self.position = position
self.value = value
self.point = (position, value)
self.flag = flag
您可以在其他答案中了解其他改进领域
答案 1 :(得分:2)
一般来说,你真的不想做这样的事情 - 你希望有责任使用正确的类型与实例化器,而不是类。
但是如果你确实想强制数字是整数,那么Python有一个特殊的模块:numbers
。
import numbers
isinstance(position, numbers.Integral) and isinstance(value, numbers.Integral)
或者,如果您必须使用all
,
all(isinstance(x, numbers.Integral) for x in (position, value))
不需要[]
。