我有以下代码 - 我想要做的事情的简化版本。 但这给了我一个递归错误。
class File:
def __new__(cls, filename):
extension = filename.split(".")[-1].lower()
if extension == "csv":
cls = CSVFile
elif extension == "json":
cls = JSONFile
else:
raise ValueError(f"Unsupported file extension: {extension}")
# instance = super().__new__(cls) # this works
instance = cls.create_instance(filename)
return instance
class CSVFile(File):
def __init__(self, filename):
self.filename = filename
@classmethod
def create_instance(cls, filename):
print("CSVFile, create_instance")
return cls(filename)
class JSONFile(File):
def __init__(self, filename):
self.filename = filename
@classmethod
def create_instance(cls, filename):
print("JSONFile, create_instance")
return cls(filename)
# Example usage
file_instance = File("data.csv")
print(f"File instance: {file_instance.filename}")
你知道如何让它发挥作用吗?
__new__
方法调用
create_method
时,
cls
间接调用自身。
如果您想要一个工厂方法,请定义一个独特的方法,而不是尝试劫持
__new__
来达到目的。