【问题标题】:When to use self and when not to use self何时使用 self 何时不使用 self
【发布时间】:2018-09-25 19:46:30
【问题描述】:

哪个类选项更可取,为什么?

选项 1

class Person():
    def __init__(self):
        pass
    def sayHello(self, name):
        print "{} says hello!".format(name)
    def driver(self):
        for name in names:        # names is generated in the driver function by some means of input
            self.sayHello(name)

选项 2

class Person():
    def __init__(self):
        self.name = None
    def sayHello(self):
        print "{} says hello!".format(self.name)
    def driver(self):
        for name in names:        # names is generated in the driver function by some means of input
            self.name = name
            self.sayHello()

您可以假设变量不仅仅是name,并且多个函数正在使用这些变量。我要说明的要点是变量值在for 循环内发生变化

【问题讨论】:

  • 选项 3。绝对是选项 3。您发布的两个选项都不好。
  • @Aran-Fey 那么有什么好的选择呢?
  • 我不清楚你为什么要使用类。这不是类的使用方式。而且我不能告诉你如何正确地做到这一点,因为我什至不知道“它”是什么。我不知道你的代码有什么意义。我最好的猜测是 sayHellodriver 应该是函数(而不是方法),并且根本不应该有类。

标签: python python-2.7 class


【解决方案1】:

即使您的示例在语法上是正确的,但它完全不能帮助您理解有关如何使用实例属性的问题。

我猜想有两个问题:

  • 何时使用类方法 (def foo(self, bar))?
  • 何时使用实例属性 (self.name)?

当您需要在函数之间“共享”变量或从函数外部检索变量时,应使用实例属性。该变量将“附加”到对象(例如,汽车的颜色、用户的昵称……)

如果你的函数/方法需要调用这种变量,必须使用self来获取,所以在定义这个函数的时候必须将它设置为第一个参数。

如果你只需要一个临时变量来循环它并做一些事情,你不需要使用类方法,一个简单的函数就可以了。

【讨论】:

  • 所以我在循环中都使用它,但是在循环时我将此变量传递给其他几个方法,这就是为什么我问我是否应该将此变量设置为self.variable 并访问@ 987654325@ 在我调用的每个方法中,或者如果我应该简单地将variable 传递给每次调用的方法。在您的汽车颜色示例中,假设我想循环遍历多种颜色(红色、绿色、蓝色),并且如果用户喜欢这种颜色isColorGood(),则以用户身份循环使用每种颜色(请注意,我还想要其他方法. 我应该为每次迭代设置self.color = color 还是简单的传递颜色?
  • 这两种策略可能都有一定的意义。对此没有绝对的回应,只有常识:循环和更改某人的名字是否有意义? (当然不,不应该有任何动作将某人的名字更改 100 倍),但是假设它是一本书,并且您有一个对象属性“current_page”,循环遍历它可能是有意义的。
  • 用书上的类比,做类似self.current_page的事情是否有意义,然后说一个名为read_page()的方法参考self.current_page或只说read_page(current_page)是否有意义.我知道它可以通过任何一种方式完成,但我在问什么是有意义的。我很清楚将一个人的名字更改 100 次是不好的,但是对于页面而言,这种引用样式是否会改变您的设计选择?
  • 视情况而定。还有其他需要知道当前页面的方法吗?你需要保存它吗? read_page(page) 优于 read_page(current_page)。唯一能让您做出正确选择的事情是它是否回答了以下问题:它是否使代码更易于阅读/理解/维护。
  • 我个人认为self 使事情更难阅读,因为您必须开始追踪可以设置/更改值的内容,同时将某些内容作为参数传递给方法很清楚值是什么是谁以及谁可以访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多