Python 我应该在什么时候使用类初始值设定项uuu init_uuuu()

Python 我应该在什么时候使用类初始值设定项uuu init_uuuu(),python,Python,我正在探索python,如果这是一个愚蠢的问题,请道歉 下面的一个函数创建了一个生成器,并给出了在给定范围0和n之间可被7整除的数字,它工作正常 class Div_By_Seven: def by_seven(self, n): yield [num for num in range(1, n + 1) if num % 7 == 0] divisible = Div_By_Seven() generator = divisible.by_seven(int(in

我正在探索python,如果这是一个愚蠢的问题,请道歉

下面的一个函数创建了一个生成器,并给出了在给定范围0和n之间可被7整除的数字,它工作正常

class Div_By_Seven:

    def by_seven(self, n):
        yield [num for num in range(1, n + 1) if num % 7 == 0]


divisible = Div_By_Seven()
generator = divisible.by_seven(int(input("Please insert a number below 51: ")))
for number in generator:
    print(number)

Please insert a number below 51: 50
[7, 14, 21, 28, 35, 42, 49]

什么时候init是必需的,什么时候它是一个选项,因为我的当前类即使没有定义构造函数也可以正常工作。

构造函数通常用于实例化对象。构造函数的任务是在创建类的对象时初始化类的数据成员的值

因此,如果在创建对象时必须定义一些变量,则可以使用构造函数,否则就不需要构造函数

在您的情况下,发生错误是因为您需要在创建对象时将参数n传递给构造函数,如下所示

class Div_By_Seven:
    def __init__(self, n):
        self.n = n

n=10
divisible = Div_By_Seven(n) #pass the parameter when creating the object
__初始化不是强制性的。它是一种方便的方法,允许您在类实例构造期间处理参数,并保证其他方法的初始状态

假设你的班级需要foo和bar。你可以用一些方法来设置它们

class Foo:

    def set_foo(self, foo):
        self.foo = foo

    def set_bar(self, bar):
        self.bar = bar

    def do_all_the_things(self):
        return self.foo + self.bar
这是可行的,但界面很糟糕。在做所有事情之前,消费者需要知道如何设置foo和bar。使用foo和bar参数定义一个_uinit_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


当使用uuu init uuu从基类继承时,如果您想更改它的功能,只需编写自己的uuu init uu。

如果您向uuu init uu添加所需的参数n,那么在按u Seven进行Div u时,您必须为它提供一个参数…@deceze:是的,我已经解决了。def uu init_uself,n:self.n=n def by_sevenself:yield[num for num in range1,self.n+1如果num%7==0]divisible=Div_By_seventinput请在51以下插入一个数字:generator=divisible.By_seven,但当构造函数定义变成mandatoryAn时,仍在寻找主要问题。类的构造函数从来都不是强制性的。这完全取决于你想让你的班级做什么。在这种情况下,班级甚至不应该在那里。在不同的调用之间不保持状态,所以一个函数就足够了。