【问题标题】:Building a good class method建立一个好的类方法
【发布时间】:2021-05-08 11:35:15
【问题描述】:

我已经建立了一个类来根据类型向用户提问。

class Question:

    def __init__(self, subject):
        self.subject = subject
        self.question = f"Enter the {subject} to be created. You may end this by typing 'DONE':\n"
        self.still_needed = True

    def ask_question(self):
        ans_list = []
        running = True
        while running:
            var = input(f"Enter {self.subject}?\n")
            if var.lower() == 'done':
                running = False
            else:
                ans_list.append(var)
        return ans_list

这个想法是有一个问题模型,创建项目列表。

这似乎适用于 main 中的以下代码。

roles = Question(subject="role").ask_question()

这会从 Queue 类创建一个列表,并使用它的方法 ask question 来生成列表。据我所知,该对象随后被销毁,因为它没有保存到变量中。

作为 Python 和 OOP 的新手,我的问题是,这似乎是一种可靠且不混淆的方式,还是我应该折射?如果是这样,社区有什么建议?

【问题讨论】:

  • 如果你不保留对象,你需要一个类来做什么?你使用它的目的就是调用这个对象的方法,就好像它是一个函数一样。因此,只需将其定义为一个函数。如果您保留一个或多个对象以供将来参考,那么一个类将是有意义的。

标签: python-3.x function oop while-loop logic


【解决方案1】:

我的意见

我想这取决于你。一方面,使用类的主要目的之一是稍后用它创建一个实例。类是对象,或者我喜欢称之为“类别”,当您的项目中有不同类型的实例时,您可以使用它们。

鉴于您的代码 sn-p,我真的无法提出任何建议,我不知道 self.question 和 self.still_needed 的用法。但是,如果我的观点仅基于这一部分:roles = Question(subject="role").ask_question(),那么我肯定会改用函数。正如你所说,

据我所知,该对象随后被销毁,因为它没有被保存 到一个变量。

替代解决方案

使用装饰器 → 带有@符号的装饰器

在这种情况下,@staticmethod 是要走的路!

什么是静态方法? staticmethod 装饰器是一种在类 中创建函数 的方法。因此,与其成为 方法,不如将其视为一个函数(没有 self 参数)。这也意味着静态方法绑定到类而不是其对象。因此,静态方法不依赖于对象(因此,您无需创建对象即可使用它)。示例:

class SomeMathStuff():
    @staticmethod
    def AddSomeNumbers(iterable):
        return sum(iterable)
 
result = SomeMathStuff.AddSomeNumbers([1, 2, 3])
# result = 6

如你所见,我不需要创建一个对象,而是只需要调用它的类来使用它。警告的话,大多数 Python 程序员认为这是非 Python 的方式,但我不会太担心。地狱,即使我有时也会使用这些方法。在我看来,这是一种组织项目的好方法。有了这个,您可以全局应用类方法,并且可以将它们“分类”到您认为合适的某些类中。

不管怎样,这就是我的全部!如果我以任何方式误导您,我深表歉意。

附加信息...以防我不是最好的老师

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2012-07-20
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多