簡體   English   中英

在 python 中擴展 class 的正確方法

[英]correct way of extending a class in python

我得到了一個A型對象的指定工廠。 我想制作一個新版本的A型對象,它也具有Mixin class 中的方法。 由於這里解釋太長的原因,我不能使用class A(Mixin) ,我必須使用A_factory 下面我試着舉一個簡單的例子。

我天真地認為從Mixin繼承來賦予A類型的對象以 mixin 方法就足夠了,但是下面的嘗試不起作用:

class A: pass

class A_factory:
    def __new__(self):
        return A()
        
class Mixin:
    def method(self):
        print('aha!')

class A_v2(Mixin):  # attempt 1
    def __new__(cls):
        return A_factory()

class A_v3(Mixin):  # attempt 2
    def __new__(cls):
        self = A_factory()
        super().__init__(self)
        return self

事實上A_v2().method()A_v3().method()引發AttributeError: 'A' object has no attribute 'method'

class A_vn(Mixin)中使用A_factory的正確方法是什么,以便工廠創建的A類型對象繼承 mixin 方法?

沒有明顯的理由為什么你需要__new__來展示你在這里展示的東西。 關於這個主題有一個很好的討論: 為什么 __init__() 總是在 __new__() 之后調用?

如果您嘗試以下操作,它應該可以工作:

class Mixin:
    def method(self):
        print('aha!')

class A(Mixin):
    def __init__(self):
        super().__init__()

test = A()
test.method()

如果您需要使用工廠方法,它應該是 function 而不是 class。 這里有一個關於如何使用工廠方法的很好的討論: https://realpython.com/factory-method-python/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM