在 class 内部或外部创建新属性

Creating new attribute inside or outside of a class

我有两个 classes(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 中定义,但在代码中,属性是使用方法的 return 值当场创建的。

谢谢

第一个选项是最好的,因为您可以通过调用输入构建对象实例所需的其他信息来获取总和和全名。

确实取决于您的用例,但我认为第一个选项更好。或者更好的方法:

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.

实例所需内存的 20%

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