我正在制作一個 python 類,其中包含員工的姓名、薪水和休假數作為屬性,并試圖顯示員工的最終薪水減去他/她沒有來的日子的薪水,但它正在顯示一個錯誤。錯誤是:
TypeError: Employee.f_salary() missing 1 required positional argument: 'self'
我已經寫了代碼:
class Employee:
def __init__(self, name, salary, no_of_leaves):
self.name = name
self.salary = salary
self.no_of_leaves = no_of_leaves
def f_salary(self):
self.f_salary1 = self.salary - 500 * int(self.no_of_leaves)
def display(self):
print(f"Employee's name: {self.name}\nEmployee's monthly salary:
{self.salary}\nNo.of leaves that employee has taken: {self.no_of_leaves}")
nol = input("No. of leaves the employee has taken: ")
john_smith = Employee('John Smith', 182500, nol)
Employee.f_salary()
Employee.display()
uj5u.com熱心網友回復:
您應該呼叫實體上的方法而不是類物件。
john_smith.f_salary()
john_smith.display()
因為self引數是對首先呼叫該方法的類實體的參考。
uj5u.com熱心網友回復:
問題是你呼叫類的方法而不是你創建的物件。
Employee.f_salary()
Employee.display()
這可以通過使用物件名稱輕松解決。
john_smith.f_salary()
john_smith.display()
但是,如果您使用該類呼叫方法,則可以顯式傳遞 self 。
class Foo:
def bar(self):
# Etc.
some_foo = Foo()
# These are more or less equivalent if we assume no class extends Foo
Foo.bar(some_foo)
some_foo.bar()
uj5u.com熱心網友回復:
實體方法只是類屬性。Employee.f_salary是對需要單個引數的函式的參考。
john_smith.f_salary,不過,更有趣。因為function物件實作了描述符協議,所以將值作為某事物的屬性訪問總是會觸發其__get__方法,因此
Employee.f_salary == Employee.__dict__['f_salary'].__get__(None, Employee)
john_smith.f_salary == Employee.__dict__['f_salary'].__get__(john_smith, Employee)
在第一種情況下,__get__只是簡單地回傳函式本身,所以當你嘗試呼叫它時,它仍然需要一個引數作為它的self引數。
在第二種情況下,__get__回傳method該類的一個實體,該實體在內部保留兩個參考:一個指向john_smith,一個指向函式本身。
當您嘗試呼叫該method物件時,它只是接受自己的引數并將它們與 一起傳遞john_smith給底層函式。
因此,john_smith.f_salary()回傳 的值Employee.f_salary(john_smith)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/409399.html
標籤:
上一篇:擁有一個什么都不做的JavaScript函式是否有效?
下一篇:如何在打字稿中使用抽象類?
