簡體   English   中英

如何以編程方式在 Python 中創建 class 方法?

[英]How do I programmatically create class methods in Python?

假設我想定義一個 Python class 其實例有幾個類似形式的成員:

class Bar:
    def __init__(self):
        self.baz=3
        self.x=1
        self.name=4

我可以使用__dict__的顯式操作一次創建所有成員:

class Bar:
    def __init__(self):
        self.__dict__.update({name: len(name) for name in ("baz", "x", "name")})

但是,如果關聯成員是class數據成員,而不是實例成員,那么我知道沒有類似的方法來以編程方式改變Bar.__dict__

class Bar:
    #Fails with "AttributeError: 'mappingproxy' object has no attribute 'update'"
    Bar.__dict__.update({name: len(name) for name in ("baz", "x", "name")})

在 Javascript 中,以編程方式操作構造函數的屬性是可能的,因為構造函數只是普通函數,它們只是普通對象,因此只是將屬性映射到更多對象的可變字典。 是否可以在 Python 中編寫類似的代碼?

我猜你可以使用一個元類,一個基數 class 和__init_subclass__使用eval來創建你的 class。下面是一個使用基數 class 的例子:

class Base:
    attrs_to_set: set[str] = set()

    def __init_subclass__(cls) -> None:
        for attr in cls.attrs_to_set:
            setattr(cls, attr, cls.get_attr_value(attr))

    @classmethod
    def get_attr_value(cls, attr_name: str):
        # default, you can change it depending on your use case i guess.
        return len(attr_name)


class Bar(Base):
    attrs_to_set = {"x", "baz", "name"}


print(Bar.x, Bar.name, Bar.baz)
# prints: 1 4 3

暫無
暫無

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

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