Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在类内部或外部创建新属性_Python_Class_Oop_Object_Attributes - Fatal编程技术网

Python 在类内部或外部创建新属性

Python 在类内部或外部创建新属性,python,class,oop,object,attributes,Python,Class,Oop,Object,Attributes,我有两个类(My_类和My_类2),它们的功能基本相同,但语法不同。我想知道哪种选择是最好的 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.

我有两个类(My_类和My_类2),它们的功能基本相同,但语法不同。我想知道哪种选择是最好的

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)
在类My_类中,属性“sum”和“fullname”在构造函数中定义为None,然后在调用方法时获取它们的值。在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 = 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

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

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
而言,将类的所有属性声明到
\uuuu init\uuuu
方法中允许类使用新的
压缩dict
,该方法在所有实例中共享键(属性名称);这样可以节省类实例所需内存的20%


可以说,方法一提供了更好的代码组织和可读性;两者都有其重要性

除此之外,对于
python>=3.6
而言,将类的所有属性声明到
\uuuu init\uuuu
方法中允许类使用新的
压缩dict
,该方法在所有实例中共享键(属性名称);这样可以节省类实例所需内存的20%


我喜欢这个,以后不需要调用这些方法。像这样,以后不需要调用这些方法。谢谢