如何依据属性判断父类实例是否为子类实例?Python代码修正
问题原因
你直接调用Person("bob", "male")创建的是Person类的实例,而Man是Person的子类——子类实例属于父类类型,但父类实例不属于子类类型,因此isinstance(bob, Man)返回False。
以下是两种可行的修正方案:
方案1:修改Person的__new__方法,自动返回对应子类实例
重写Person的__new__方法,让它在创建实例时根据gender参数选择对应的子类生成实例,这样直接调用Person(...)就能得到对应性别子类的实例:
class Person: def __new__(cls, name, gender): # 根据性别选择子类创建实例 if gender == 'male': return super().__new__(Man) elif gender == 'female': return super().__new__(Woman) else: raise ValueError("Invalid gender") def __init__(self, name, gender): self.name = name self.gender = gender def __repr__(self): return f"{self.__class__.__name__}(name={self.name}, gender={self.gender})" class Man(Person): pass class Woman(Person): pass bob = Person("bob", "male") print(isinstance(bob, Man)) # 输出 True
说明:__new__是Python中负责创建实例的核心方法,这里通过判断gender,让Person的构造逻辑返回Man或Woman的实例,此时bob本质是Man类的实例,isinstance检查自然返回True。同时简化了Man和Woman的代码,因为它们的__init__和父类完全一致,可以直接省略。
方案2:使用已有的create_person工厂方法创建实例
原代码中已经定义了create_person类方法,它会根据gender返回对应子类的实例,直接用这个方法替代Person(...)即可:
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.create_person("bob", "male") print(isinstance(bob, Man)) # 输出 True
说明:这种方法不需要修改类的构造逻辑,直接利用已有的工厂方法生成对应子类实例,符合工厂模式的设计思路。
内容的提问来源于stack exchange,提问作者joylix
相关产品推荐
相关产品推荐

