Python实现Abstract Factory模式时遇TypeError错误求助
Abstract Factory设计模式实现错误修复
错误原因
你在Benz和Bmw这两个具体工厂类中,call_suv和call_coupe方法返回的是类本身(比如return Gla),而不是类的实例。当你调用result.create_coupe()时,相当于用类直接调用实例方法,而实例方法必须依赖类的实例(也就是self参数),因此会抛出TypeError: Cls.create_coupe() missing 1 required positional argument: 'self'错误。
修复方案
把工厂方法中的返回值改为类的实例,即在类名后添加(),创建并返回对象实例。
修复后的完整代码
""" Abstract Factory - Abstract Factory Pattern serves to provide an interface for creating related/dependent objects without need to specify their actual class Car => Benz, Bmw => Suv, Coupe benz suv = gla bmw suv => x1 benz coupe => cls bmw coupe =>m2 """ from abc import ABC, abstractmethod class Car(ABC): # Abstract Factory @abstractmethod def call_suv(self): pass @abstractmethod def call_coupe(self): pass class Benz(Car): # Concrete Factory 1 def call_suv(self): return Gla() # 改为返回实例 def call_coupe(self): return Cls() # 改为返回实例 class Bmw(Car): # Concrete Factory 2 def call_suv(self): return X1() # 改为返回实例 def call_coupe(self): return M2() # 改为返回实例 class Suv(ABC): # Abstract Product 1 @abstractmethod def create_suv(self): pass class Coupe(ABC): # Abstract Product 2 @abstractmethod def create_coupe(self): pass class Gla(Suv): # Product 1-1 def create_suv(self): print(f" Benz + suv => Gla") class X1(Suv): # Product 2-1 def create_suv(self): print(f" Bmw + suv => X1") class M2(Coupe): # Product 2-2 def create_coupe(self): print(f" Bmw + coupe => M2") class Cls(Coupe):# Product 1-2 def create_coupe(self): print(f" Benz + coupe => Cls") def client_suv(order): #client brand = {"bmw": Bmw, "benz": Benz} result = brand[order]().call_suv() result.create_suv() def client_coupe(order):#client brand = {"bmw": Bmw, "benz": Benz} result = brand[order]().call_coupe() result.create_coupe() client_coupe('benz')
运行结果
执行后会输出:
Benz + coupe => Cls
内容的提问来源于stack exchange,提问作者hamid reza
相关产品推荐
相关产品推荐

