当前位置: 首页 > 知识库问答 >
问题:

测试实例是否来自同一个类

刘琨
2023-03-14

我有一个主要的“抽象”类宠物,和两个“真实”类狗和猫。当我有两个宠物的例子时,我想知道它们是否是“同一种宠物”,而不考虑它们是哪种宠物。

我试过这个

#!/usr/bin/python

class Pet:
    name = "pet"

    def __eq__(self, other):
        return type(self) == type(other)
#        return type(self).__name__ == type(other).__name__
#        return self.__class__ == other.__class__
#        return self.__class__.__name__ == other.__class__.__name__
#        return self.__class__ is other.__class__
#        return self.__class__.__name__ is other.__class__.__name__
#        return isinstance(other, type(self).__name__)
#        return isinstance(other, type(self))
#        return isinstance(self, type(other).__name__)
#        return isinstance(self, type(other))
#        return type(self) is type(other)
#        return type(self).__name__ is type(other).__name__

class Dog:
    name = "dog"

class Cat:
    name = "cat"

dog1 = Dog()
dog2 = Dog()
cat1 = Cat()
cat2 = Cat()

print("dog1 == dog2: {0}".format(dog1 == dog2))
print("cat1 == cat2: {0}".format(cat1 == cat2))
print("cat1 == dog1: {0}".format(cat1 == dog1))

我尝试了所有评论的返回,它总是给出这样的结果:

$ ./test.py 
dog1 == dog2: False
cat1 == cat2: False
cat1 == dog1: False

有没有办法在主类中进行这样的测试以避免代码重复?

编辑:
多人提到它忘记了子类化部分
这可以按预期工作

#!/usr/bin/python

class Pet:
    name = "pet"

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

class Dog(Pet):
    name = "dog"

class Cat(Pet):
    name = "cat"

共有2个答案

扶杜吟
2023-03-14

您可以使用类__名称用于此:

dog1__name__ == dog2.__name__

使现代化

正如@Tbaki所说,您也可以使用type()

type(dog1) == type(dog2)

另一个更新

type(dog1) is type(dog2) # notice that I use 'is'
华森
2023-03-14

一种方法是使用上面代码中定义的name参数。另外,Dog

#!/usr/bin/python

class Pet:
    name = "pet"

    def __eq__(self, other):
        return self.name == other.name


class Dog(Pet):
    name = "dog"

class Cat(Pet):
    name = "cat"

dog1 = Dog()
dog2 = Dog()
cat1 = Cat()
cat2 = Cat()

print("dog1 == dog2: {0}".format(dog1 == dog2))
print("cat1 == cat2: {0}".format(cat1 == cat2))
print("cat1 == dog1: {0}".format(cat1 == dog1))
 类似资料:
  • 我实际上有两种类型的数据: 我想用Hamcrest在我的身体响应中测试我的放心请求后,b(元素接收)是否包含来自a的一个或多个元素(

  • 我有一个java类,它打开两个Chrome浏览器,分别搜索“测试1”和“测试2”。然而,一旦两个浏览器都打开,只有一个带有谷歌页面的浏览器会搜索“测试1测试2”。 我相信这个问题可能是因为我从父类调用驱动程序 = 新的 WebDriver。但是,我不确定如何解决此问题。 下面是我尝试并行运行的两个方法。 这是我用来调用它们的xml文件。 包含驱动程序的父方法 当前结果:打开两个浏览器,每个浏览器都

  • # 11.5 测试一个值是否实现了某个接口 这是 11.3 类型断言中的一个特例:假定 v 是一个值,然后我们想测试它是否实现了 Stringer 接口,可以这样做: type Stringer interface { String() string } if sv, ok := v.(Stringer); ok { fmt.Printf("v implements Strin

  • 我对LiquiBase是全新的... 今天,我使用--Liquibase格式化SQL编写了一个Liquibase变更集。 Liquibase是否支持一种无需实际运行就可以测试这类事情的方法,这样我就可以避免编辑回滚中的校验和问题? 失败:是否有一个解决校验和问题的方法,可以让我在运行更新后编辑我的文件?(Ctrl+Z?)

  • 问题内容: 有没有办法确定对象是否是泛型类型的实例? 这显然行不通。还有其他选择吗?就像我想使用Java反射来实例化一个类,然后检查以确保它是通用类型。 问题答案: 进行此检查的唯一方法是,是否具有表示类型的对象:

  • 对于此示例: 如何检查 是否是 Foo 的实例(但不是其 foo 子类的实例)?那是: checkInstance(qux,Foo.class)=true checkInstance(qux,Bar.class)=false 有没有类似于< code>instanceof的语句来进行这种检查?或者我应该使用< code>qux.getClass()。equals(Foo.class)