Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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_Python 3.x - Fatal编程技术网

Python 附加到实例(对于类列表属性)

Python 附加到实例(对于类列表属性),python,python-3.x,Python,Python 3.x,编写以下append语句的最具Python风格的方式是什么: class MyClass(): my_list = None def __init__(self): self.attr_a = 'whatever_a_is' # NOTE below is commented out here because it's # NOT needed by most instances: # self.my_list =

编写以下append语句的最具Python风格的方式是什么:

class MyClass():
    my_list = None

    def __init__(self):
        self.attr_a = 'whatever_a_is'
        # NOTE below is commented out here because it's
        # NOT needed by most instances:
        # self.my_list = []


my_class_instance= MyClass()
# Append 'a_certain_value' to list attribute if it exists
# else create it:
if my_class_instance.my_list:
    my_class_instance.my_list.append('a_certain_value')
else:
    my_class_instance.my_list = ['a_cetain_value']

谢谢你的帮助。

如果我让它写了,你不想在初始化时设置
我的列表
属性,而只是在第一次使用时

一种方法是构建一个自定义的append方法,该方法执行该任务并且对用户透明:

class MyClass:

    def __init__(self):
        # do something here
        pass

    def custom_append(self, a_certain_value):
        if hasattr(self, 'my_list'):
            self.my_list.append(a_certain_value)
        else:
            self.my_list = [a_certain_value]


my_class_instance = MyClass()

my_class_instance.custom_append('a_certain_value')

但是很少有情况下,您不希望在创建实例时将
my_list
初始化为空列表。

初始化类时,它会设置
my_list=None
。最好设置
my_list=[]
,这样调用者就可以简单地附加到列表中,而不用担心它是否存在。这比你现在拥有的更具蟒蛇式



附言

对未来代码的建议是,如果my_class_instance.my_list是my_class_instance.my_list不是None,则用
替换
,使其更“Pythonic”:

if my_class_instance.my_list is not None:
    my_class_instance.my_list.append("a_certain_value")
else:
    my_class_instance.my_list = ["a_certain_value"]

最好是把它塞进
MyClass
append
方法中,这样调用者就不必担心它,或者从一开始就把
myu list
变成一个空列表。如果将其设置为空列表,则在使用append等方法(将其追加到所有实例中)时会产生可变类属性的陷阱。如果是在初始化新实例时,请参考上面init函数中的注释代码。另一方面,自定义build append方法是一个选项,但我想看看在标准library.Tks中是否有更简单的方法来处理这个问题。第一个选项不能帮助我避免冗长的if/else语句。第二个已经在我的代码中(请检查init中的注释内容)当然可以工作。但是,正如我在上面的帖子中所提到的,如果存在标准库的方法,我会更喜欢它……hasattr是一个python内置函数。您可以在自定义方法中使用try/except语句完成相同的工作。总之,我没有听说过一种特殊的append方法,它可以创建atribute if not existI,我希望dicts有类似setdefault的东西