You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何依据属性判断父类实例是否为子类实例?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 13:10:27