Skip to content

[地雷] class 成員屬性,最好只宣告,不要定義

tsungjung411 edited this page Sep 5, 2018 · 3 revisions

術語

  • 宣告(declaration):只定義「變數型別」和「變數名稱」,不包含「給予初始值」。對 python 來說,只有「變數名稱」。

    • int x;
    • int *x_ptr;
    • char ch;
  • 定義(definition):除了可包含宣告的動作之外,必須包含「給予初始值」,將「變數的值」儲存至「變數記憶體」裡。

    • int x = 0;
    • int x; <-- 先宣告
      x = 0; <-- 後定義

範例

程式碼

class FruitList:
    __name_list = []
    
    def append(self, name):
        self.__name_list.append(name)
    # end-of-def
    
    def __repr__(self):
        return repr(self.__name_list)
    # end-of-def
# end-of_class

a = FruitList()
a.append('apple')
a.append('banana')
a.append('cherry')
print(a)

b = FruitList()
b.append('apple')
b.append('banana')
b.append('cherry')
print(b)

執行結果:

['apple', 'banana', 'cherry']
['apple', 'banana', 'cherry', 'apple', 'banana', 'cherry'] <--- 非預期結果

正確使用成員屬性

程式碼

class FruitList:
    __name_list = None
    
    def __init__(self):
        self.__name_list = []
    # end-of-def
# end-of-class

可參考

Clone this wiki locally