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