2

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'
4

2 に答える 2

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

あなたが他の答えで読むことができる他の改善の分野があります

于 2012-07-12T11:19:41.500 に答える
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))

の必要はありません[]

于 2012-07-12T11:23:49.560 に答える