我有一个主要的“抽象”类宠物,和两个“真实”类狗和猫。当我有两个宠物的例子时,我想知道它们是否是“同一种宠物”,而不考虑它们是哪种宠物。
我试过这个
#!/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"
您可以使用类__名称
用于此:
dog1__name__ == dog2.__name__
使现代化
正如@Tbaki所说,您也可以使用type()
:
type(dog1) == type(dog2)
另一个更新
type(dog1) is type(dog2) # notice that I use 'is'
一种方法是使用上面代码中定义的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)