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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:43:16