我无法理解在哪些方法中包含哪些参数

I am have trouble understanding which parameters to include in which methods

我正在阅读有关 类 的一章,但我无法理解哪些参数应该包含在哪些方法中。例如在这段代码中:

class Employee:
    '''A simple class to describe an employee.'''

    def __init__(self, first_name, last_name, salary, sal_raise=5000):
        '''Initialize first name, last name, salary, and maybe raise?'''
        self.first_name = first_name
        self.last_name = last_name
        self.salary = salary
        self.sal_raise = sal_raise

    def give_raise(self):
        self.salary += self.sal_raise
        print(f'''You've given {self.first_name} a ${self.sal_raise} raise!''')

sal_raise 目前是 __init__() 方法中的一个参数。这是唯一的方法吗?难道不能在 give_raise 方法中初始化 sal_raise 吗?像这样:

def give_raise(self):
    self.sal_raise = 5000
    self.salary += self.sal_raise

在这种情况下,每次加薪的金额很可能会有所不同。所以你不想在初始化时设置一次或将它作为一个不变的值。

相反,您可以将加注作为 give_raise:

的参数
class Employee:

    def __init__(self, first_name, last_name, salary):
        self.first_name = first_name
        self.last_name = last_name
        self.salary = salary

    def give_raise(self, sal_raise):
        self.salary += sal_raise
        print(f'''You've given {self.first_name} a £{sal_raise} raise!''')
        print(f'''{self.first_name}'s salary is now £{self.salary}!''')


robson = Employee("Robson", "Moon", 100000)
robson.give_raise(5000)
robson.give_raise(2000)

那将输出:

You've given Robson a £5000 raise!
Robson's salary is now £105000
You've given Robson a £2000 raise!
Robson's salary is now £107000

你知道 __init__() 方法和 class 中定义的其他方法有什么区别吗?没有什么 !唯一的区别是 __init__() 在实例化 class 时“自动”被调用。

有什么好处?您没有 __init__() 的图像,为了为您的实例设置一些初始值,您必须显式调用一个方法:

class Person:

    def initialize_my_class(self, name):
        self.name = name
        self.age = 10
        self.height = 100

p1 = Person()

print(p1.name)    #  AttributeError: 'Person' object has no attribute 'name'
print(p1.age)     #  AttributeError: 'Person' object has no attribute 'age'
print(p1.height)  #  AttributeError: 'Person' object has no attribute 'height'

为什么?因为 python 不会自动 运行 我的 initialize_my_class 方法。如果我想让它工作,我必须自己调用它:

class Person:

    def initialize_my_class(self, name):
        self.name = name
        self.age = 10
        self.height = 100

p1 = Person()

p1.initialize_my_class('Soroush')  # <---------- Here

print(p1.name)
print(p1.age)
print(p1.height)

__init__() 会自动执行此操作。想象一下,您的 class 中有数十个方法,如果没有 __init__(),您必须一个接一个地调用它们……但是我们只是在 __init__() 中执行我们想要的所有初始化操作.

现在你的 sal_raise :通常,如果这是你在初始化部分需要的东西,请在 __init__() 中定义它。 但是有时我们希望我们的实例具有我们想要的“任何时候”的属性!不在初始化阶段。为什么?

有时我们必须计算一些足够重或耗时的东西(不仅仅是存储一个数字),我们在一个单独的方法中将该属性设置到我们的实例,并在必要时调用它!也许当程序达到某个条件时。因此,只需让 __init__ 包括我们在实例化阶段所需的其他初始化:

class Person:

    def __init__(self, name):
        self.name = name
        self.age = 10
        self.height = 100
        
    def time_consuming_method(self):
        # This 'foo' is the result of heavy calculation here
        self.new_var = 'foo'

p1 = Person('soroush')

# special condition is true...
# Now it's time to call 'time_consuming_method':
p1.time_consuming_method()

希望这是有道理的。