“Man”是“Person”的子类,具有属性gender='male '。如何判断Person的instance是否是Man的instance?假设Bob=Person(name='bob ',gender='male'),我如何获得isinstance(Bob,Man)=True?
class Person:
def __init__(self, name, gender):
self.name = name
self.gender = gender
def __repr__(self):
return f"Person(name={self.name}, gender={self.gender})"
@classmethod
def create_person(cls, name, gender):
if gender == 'male':
return Man(name, gender)
elif gender == 'female':
return Woman(name, gender)
else:
raise ValueError("Invalid gender")
class Man(Person):
def __init__(self, name, gender):
super().__init__(name, gender)
class Woman(Person):
def __init__(self, name, gender):
super().__init__(name, gender)
bob = Person("bob", "male")
print(isinstance(bob, Man))
字符串
我得到的结果是“假”,但不是“真”,我应该如何纠正它?
2条答案
按热度按时间r6l8ljro1#
Person是你的超类。男人和女人是人的子类。
因此,你应该构建男人或女人-而不是人
也许这会让事情变得更清楚:
字符串
输出:
型
当然,你可能想要一个替代使用类名的方法,所以通过使用class属性,我们可以做到这一点:
型
输出:
型
qq24tv8q2#
这在技术上是可行的,而且在某些情况下非常有用。话虽如此,正如在其他几个答案中所述,这是一种反模式,并将打破Python中被认为是“标准”的一堆东西,因此如果可以的话,您可能更喜欢Factory Design Pattern。
因此,请负责任地享受以下内容。
最简单的方法是使用
__init_subclass__
方法,在创建子类时将子类注册到超类中(如this answer所示),然后在__init__
期间动态更改示例类。动态更改类对于不熟悉您的代码的人来说确实很混乱,而且看起来像是变魔术,所以您需要适当地记录它。这也意味着你在任何子类'
__init__
'中所能做的都是非常有限的。您需要创建一个__post_init__
,它可以通过子类进行专门化(类似于dataclasses.dataclass
结构)。字符串
如果我们以“通常”的方式做事,我们会得到预期的结果:
型
今天有个人出生了。他叫戴夫。
男性(姓名=Dave,性别=man)
如果我们以“新的”/“非常规的”/“错误的”方式做事,我们也会得到想要的结果:
型
今天有个人出生了。他叫汤姆。
男(姓名=Tom,性别=man)
作为一个额外的好处,我们可以示例化一个没有性别的人,他们将拥有默认的
Person
类。型
今天有一个人出生了。他们的名字是艾萨克。
人员(姓名=Isaac,性别=未知)