【问题标题】:What does self.function in __init__ do to a function?__init__ 中的 self.function 对函数有什么作用?
【发布时间】:2022-01-06 22:39:56
【问题描述】:

我最近尝试进入 OOP 以迈向更高级的 python。我想做一个类中的函数列表。我从 not 开始使用self.functionName = functionName,这导致无法在列表中识别功能的错误。所以我假设你在__init__ 函数中写的内容在类中作为全局函数工作,所以我将self 添加到前两个函数中,以便它们可以在另一个函数中使用,并且效果很好。但是,当我将 self 添加到最后一个函数时,我没有得到相同的答案,这是为什么呢?

这是我写的代码:

>>> class number:        #works fine, no self.ans
    def __init__(self):
        self.numOne = numOne
        self.numTwo = numTwo
    def numOne(self):
        print("one")
    def numTwo(self):
        print("two")
    def ans(self):
        bruh = [numOne, numTwo]
        for i in bruh:
            i()
            
>>> a = number()
>>> a.ans()
one
two

>>> class number:        #now when I write self.ans
    def __init__(self):
        self.numOne = numOne
        self.numTwo = numTwo
        self.ans = ans
    def numOne(self):
        print("one")
    def numTwo(self):
        print("two")
    def ans(self):
        bruh = [numOne, numTwo]
        for i in bruh:
            i()

>>> a = number()
>>> a.ans()
<generator object ans.<locals>.<genexpr> at 0x0000021476FDBF90>    #this is the result
>>> 

【问题讨论】:

  • 你不需要像self.numOne = numOne这样的语句——通过在类的主体中定义numOne,它自动成为类的一部分,每个对象都可以调用self.numOne()
  • @Grismar 这定义了一个名为 numOneclass 属性,其行为与 instance 属性不同。如果它是可变值,则差异非常重要。
  • 列表必须是bruh = [self.numOne, self.numTwo]。这里不需要init函数。
  • 应该有很多NameErrors 被提出,因为你没有定义全局变量。第二个a.ans() 的结果表明您定义了许多尚未显示的变量,并且与您尝试构建的示例没有真正的关系。

标签: python oop


【解决方案1】:

您不需要在构造函数中将方法分配给实例。这就是类工作方式的一部分。

这可以正常工作:

class Number:
    def num_one(self):
        print("one")

    def num_two(self):
        print("two")

    def ans(self):
        bruh = [self.num_one, self.num_two]
        for i in bruh:
            i()


n = Number()
n.ans()

结果:

one
two

当然,如果您需要设置一些初始值,您仍然可以使用__init__,但类不需要自定义构造函数。只需将其声明为class,它就会有一个构造函数,您可以根据需要覆盖它。

顺便说一句,你最好用以大写字母开头的名称来命名你的类。用骆驼大写命名方法更像是一种品味,但我觉得下划线更符合 Python 风格——不过,大写字母肯定是可以使用的,以避免人们混淆对象和类。

【讨论】:

    猜你喜欢
    • 2023-01-16
    • 2020-01-24
    • 2013-07-27
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多