Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从基类中查找实例类型的Pythonic方法是什么?_Python_Inheritance - Fatal编程技术网

从基类中查找实例类型的Pythonic方法是什么?

从基类中查找实例类型的Pythonic方法是什么?,python,inheritance,Python,Inheritance,考虑以下(愚蠢的)MWE: 其中,clone方法的目的是创建相同类型但不同颜色的新车 显然,由于clone操作在继承自CarABC的所有类中都很常见,因此它应该是基类的一种方法。但是,该方法需要知道调用它以返回正确类型的car的子类 我想知道我在示例中使用的方法是否正确(并且是Pythonic)来确定调用该方法的基类的类型?根据(emphasis是我的): 使用一个参数,返回对象的类型。返回值是一个类型对象,通常与返回的对象相同 建议使用内置函数测试对象的类型,因为它考虑了子类 在这里使用isi

考虑以下(愚蠢的)MWE:

其中,
clone
方法的目的是创建相同类型但不同颜色的新车

显然,由于
clone
操作在继承自
CarABC
的所有类中都很常见,因此它应该是基类的一种方法。但是,该方法需要知道调用它以返回正确类型的car的子类

我想知道我在示例中使用的方法是否正确(并且是Pythonic)来确定调用该方法的基类的类型?

根据(emphasis是我的):

使用一个参数,返回对象的类型。返回值是一个类型对象,通常与返回的对象相同

建议使用内置函数测试对象的类型,因为它考虑了子类

在这里使用isinstance显然是一个糟糕的设计决策,因为基类必须知道(并迭代)它的所有子类

更干净的克隆方法变体为:

def克隆(自身,颜色):
cls=自我分类__
返回cls(颜色)
缺点是,如果向子类初始值设定项添加一些其他(非默认)参数,则无法对其进行实例化


需要注意的是,在这种情况下使用类型是可以的(如果使用旧式类,这可能是唯一的方法,但这些类只存在于Python2.only中)。

isinstance
应该可以回答以下问题:我不确定
isinstance
仅检查
self
是否为
Ford
Toyota
。它不会返回类型。但这不正是您通过打印“yx正在运行”实现的吗?啊:对不起……不,我明白了……但不知道;)我的问题是关于我在
clone
方法中正在做什么,而不是
run
方法。
from abc import ABC, abstractmethod

class CarABC(ABC):
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def __str__(self):
        return "%s %s" % (self.color, self.name)

    @abstractmethod
    def run(self):
        raise NotImplementedError()

    def clone(self, color):
        car = type(self)
        return car(color)

class Ford(CarABC):
    def __init__(self, color):
        super().__init__("Ford", color)


    def run(self):
        print("Ford is running")


class Toyota(CarABC):
    def __init__(self, color):
        super().__init__("Toyota", color)

    def run(self):
        print("Toyota is running")