【问题标题】:I am have trouble understanding which parameters to include in which methods我无法理解哪些参数包含在哪些方法中
【发布时间】:2021-10-11 17:48:13
【问题描述】:

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

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

【问题讨论】:

  • 是的,虽然self.salary += 5000 更简洁,但这绝对没问题。或者将其添加为give_raise 方法的默认参数。
  • 将加薪金额作为give_raise() 的参数可能更有意义,这样您就不会被员工的单次加薪金额所困扰。
  • 这很好,除了如果你按照 Marcin 的建议去做,那么当你想加薪时,你的 Employee 对象的 sal_raise 属性将始终为 5000。换句话说,每次你想give_raise(),加薪总是5000。换一种方式或按照@jasonharper的建议做至少可以让你改变加薪金额。

标签: python class oop python-class


【解决方案1】:

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

有什么好处?您没有__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__() 只是自动执行此操作。想象一下,您的类中有数十个方法,如果没有 __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()

希望这是有道理的。

【讨论】:

  • 谢谢!这非常有用!
【解决方案2】:

在这种情况下,每次加薪的金额可能会有所不同。因此,您不希望在初始化时设置一次或将其设置为不变的值。

相反,您可以将 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

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2020-01-08
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多