一个带有标志的类或多个不同的类

2024-06-18 17:38:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我进退两难。我正在制作数百种不同类型的物体。一般来说,他们将是Food,但主要是它将被指定是什么类型的食物。你知道吗

class Food(object):
    def __init__(self, taste = None):
        self._taste = taste
class Bread(Food):pass
class Meat(Food):pass
class Soup(Food):pass

class Food(object):
    def __init__(self, isbread = False, ismeat = False, issoup = False):
        self.is_bread = isbread
        self.is_meat = ismeat
        self.is_soup = issoup

然后我将比较这些对象,就像在一个数组中有两个面包一个接一个。我想知道哪一个更符合'面向对象的艺术',这可能是更python。使用标志似乎比每次比较两个对象时调用实例更快更容易。你知道吗


Tags: 对象selffalse类型objectfoodinitis
2条回答

使用不同的类更像是OOP和python。使用gflags代替gflags仅仅意味着将类型的信息存储在类型中以外的其他地方。你知道吗

现在有趣的部分是使用类型信息,使代码可读、清晰并具有良好的性能。老实说,我会忽略后者而选择好的代码,直到它成为一个问题。你知道吗

由于使用该类型的唯一示例是比较对象是否为同一类型,因此可以很容易地执行以下操作:

type(bread1) == type(bread2)

您还可以创建方法或重载操作符来对代码的大部分部分隐藏机制,但最简单和最可读的方法在很大程度上取决于您的实际用例。你知道吗

举你在讨论中提到的另一个例子:要比较任何面包是否相等,你可以这样做:

class Bread(Food):
    def __eq__(self, other):
        return isinstance(other, Bread)

这样显式地做可以让您拥有子类Baguette(Bread)Roll(Bread),它们的实例都是breads,它们与Bread本身的任何实例相比也会相等。你知道吗

显然第一个选项更像python,与OOP保持一致。你知道吗

class Food(object):
    def __init__(self, taste = None):
        self._taste = taste
class Bread(Food):pass
class Meat(Food):pass
class Soup(Food):pass

这意味着所有SoupMeatBread对象都是Food,并且具有公共属性。 那么,你需要比较两个物体是否属于同一个食物亚类。只需使用^{}内置方法,并检查True。例如

>>> bread = Bread()
>>> soup = Soup()
>>> isinstance(bread, Soup)
False
>>> isinstance(bread, soup.__class__)
False
>>> isinstance(bread, Bread)
True

如果要使用==运算符比较对象,只需重写__eq__(equals)方法。如下所示

class Food(object):

    def __init__(self, taste = None):
        self._taste = taste

    def __eq__(self, other):
        return (isinstance(other, self.__class__)

然后比较像这样的物体

>>> bread1 = Bread()
>>> bread2 = Bread()
>>> soup = Soup()
>>> bread1 == soup
False
>>> bread1 == bread2 #Are both breads?
True 

相关问题 更多 >