最好的做法是避免“自我”和“自我”。实例?

时间:2018-02-21 17:04:53

标签: python python-3.x oop

如果我要实现一个类,例如:

class LinkedList:

    def __init__(self):
        self.head = None

    def size(self):
        self.count = 0
        self.current = self.head

        while self.current != None:
            self.current = self.current.get_next()
            self.count += 1

        return self.count

size方法在self.count变量不使用current的情况下可以正常工作,所以我想知道:

  1. 为什么countcurrent无论是否有self.都有效,而self.head没有它就无法工作?< / p>

  2. 在不一定需要self.的情况下使用<resource-file src="src/android/libs/armeabi/libserial_port.so" target="libs/armeabi/libserial_port.so">通常是不好的做法吗?

3 个答案:

答案 0 :(得分:0)

这里使用和不使用Builder.load_string(''' #:import AnchorLayout kivy.uix.anchorlayout #:import Layout kivy.uix.layout <ChatBotScreen>: BoxLayout: orientation: 'vertical' ScrollView: Label: size_hint_y: None height: self.texture_size[1] text_size: self.width, None botOutput: root.botOutput ScrollView: Label: size_hint_y: None height: self.texture_size[1] text_size: self.width, None userInput: root.userInput TextInput: id: ti_userinput multiline: False on_text_validate: root.on_text_validate() ''') class ChatBotScreen(Screen): userInput = StringProperty() botOutput = StringProperty() def on_text_validate(self): text_input_userInput = self.ids['ti_userinput'].text self.ids['ti_userinput'].text = '' print(text_input_userInput) sm = ScreenManager(transition=FadeTransition()) sm.add_widget(ChatBotScreen(name='mainchat')) class MyApp(App): def build(self): return sm 之间存在差异。

如果您使用trailer,实际上是在self.上调用的任何对象中添加self.count属性。

如果您不使用current,则需要在size方法中定义名为self.count的局部变量。

这意味着如果你有current,你可以这样做:

size

如果您不使用self.。以上将产生错误,指出my_list = LinkedList() my_list.size() print(my_list.count) 不是属性。

self.需要count的原因是因为head是您在self.中写的实例属性。显然,当您计算链表的大小时,您想要使用当前实例的head。这就是你将其称为__init__的原因。只有head才会引用一个未定义的局部变量。

关于在这种情况下使用self.head是否合适的问题。我会说不,因为headself.的性质似乎只是用于计算大小的辅助变量,并且将它们作为{{1的属性 - 没有意义}。class。

答案 1 :(得分:0)

  1. 简单地说,必须使用self来引用head变量的原因是因为head实例属性。换句话说,为head的每个实例创建LinkedList属性,并且要访问内部head属性,必须使用self

  2. 是的,不必要地使用self是不好的做法。 self仅应用于引用或创建实例属性。只需创建普通局部变量就足够的实例属性是不必要的,如果多次调用size,可能效率低下。

答案 2 :(得分:0)

使用自身对象,您将这些变量与类对象相关联,并且可以在整个类中访问它。

如果省略self,那么这些变量的范围仅在size函数内。