簡體   English   中英

在 class 內部或外部創建新屬性

[英]Creating new attribute inside or outside of a class

我有兩個類(My_class 和 My_class2),它們的功能基本相同,但語法不同。 我想知道哪些選項是最好的。

class My_class():
    def __init__(self, int1, int2, str1, str2):
        self.int1 = int1
        self.int2 = int2
        self.str1 = str1
        self.str2 = str2
        self.sum = None
        self.fullname = None

    def add_ints(self):
        self.sum = self.int1 + self.int2

    def concat_strings(self):
        self.fullname = self.str1 + ' ' + self.str2


class My_class2():
    def __init__(self, int1, int2, str1, str2):
        self.int1 = int1
        self.int2 = int2
        self.str1 = str1
        self.str2 = str2

    def add_ints2(self):
        return self.int1 + self.int2

    def concat_strings2(self):
        return self.str1 + ' ' + self.str2



obj1 = My_class(1, 2, 'Peter', 'Philips')

obj1.add_ints()
obj1.concat_strings()

print(obj1.sum, obj1.fullname)



obj2 = My_class2(10, 20, 'John', 'Norton')

obj2.sum = obj2.add_ints2()
obj2.fullname = obj2.concat_strings2()

print(obj2.sum, obj2.fullname)

在 class My_class 中,屬性 'sum' 和 'fullname' 在構造函數中定義為 None ,然后在調用方法時它們得到它們的值。 在 My_class2 中,屬性未在 class 中初始定義,但在代碼期間,屬性是使用方法的返回值在現場創建的。

謝謝

真的取決於你的用例,但我認為第一個選項更好。 或者更好的方法:

class My_class():
    def __init__(self, int1, int2, str1, str2):
        self.int1 = int1
        self.int2 = int2
        self.str1 = str1
        self.str2 = str2
        self.sum = self.add_ints()
        self.fullname = self.concat_strings()

    def add_ints(self):
        return self.int1 + self.int2

    def concat_strings(self):
        return self.str1 + ' ' + self.str2

可以說,方法一提供了更好的代碼組織和可讀性; 兩者都有其重要性。

除了這些考慮之外,對於python >= 3.6 ,將 class 的所有屬性聲明到__init__方法中,允許 class 使用新的compact dict ,該字典共享密鑰(跨所有實例) 這節省了 class 實例所需的 memory 的 20%。

https://youtu.be/p33CVV29OG8?t=2012

第一個選項是最好的,因為您可以通過調用獲取總和和全名,該調用輸入了構建 object 實例所需的其他信息。

暫無
暫無

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

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