簡體   English   中英

如何在 Python 中定義一個類?

[英]How can I define a class in Python?

很簡單,我正在學習Python,但找不到告訴我如何編寫以下內容的參考:

public class Team {
     private String name;
     private String logo;
     private int members;

     public Team(){}

     // Getters/setters
}

之后:

Team team = new Team();
team.setName("Oscar");
team.setLogo("http://....");
team.setMembers(10);

這是一個具有以下屬性的類 Team:名稱/徽標/成員

編輯

經過幾次嘗試,我得到了這個:

class Team:
    pass

之后

team = Team()
team.name = "Oscar"
team.logo = "http://..."
team.members = 10

這是 Python 的方式嗎? 感覺很奇怪(當然來自強類型語言)。

以下是我的建議:

class Team(object):
    def __init__(self, name=None, logo=None, members=0):
        self.name = name
        self.logo = logo
        self.members = members

team = Team("Oscar", "http://...", 10)

team2 = Team()
team2.name = "Fred"

team3 = Team(name="Joe", members=10)

關於這個的一些注意事項:

  1. 我聲明Team繼承自object 這使得 Team 成為一個“新式班級”; 自 Python 2.2 引入以來,這一直是 Python 中的推薦做法。 (在 Python 3.0 及更高版本中,即使您省略了(object)表示法,類也始終是“新式”的;但使用該表示法並沒有什么害處,並使繼承變得明確。)這是關於新式類的 Stack Overflow 討論.

  2. 這不是必需的,但我讓初始化程序采用可選參數,以便您可以在一行上初始化實例,就像我對teamteam3 這些參數是命名的,因此您可以提供值作為位置參數(與team ),或者您可以使用argument=形式,就像我對team3所做的team3 當您明確指定參數的名稱時,您可以按任意順序指定參數。

  3. 如果你需要 getter 和 setter 函數,也許是為了檢查一些東西,在 Python 中你可以聲明特殊的方法函數。 這就是 Martin v. Löwis 所說的“財產描述詞”的意思。 在 Python 中,簡單地分配給成員變量,然后簡單地引用它們來獲取它們,通常被認為是一種很好的做法,因為如果您需要它們,您可以隨時添加屬性描述符。 (如果您永遠不需要它們,那么您的代碼就不會那么雜亂,並且花費的時間也更少。獎金!)

這是關於屬性描述符的一個很好的鏈接: http : //adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

注意:Adam Gomaa 的博客似乎從網絡上消失了。 這是在 archive.org 上保存的副本的鏈接:

https://web.archive.org/web/20160407103752/http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

  1. 如果您將值指定為Team()調用的一部分,或者您稍后將它們插入類實例中,這並不重要。 您最終得到的最終類實例將是相同的。
team = Team("Joe", "http://example.com", 1)
team2 = Team()
team2.name = "Joe"
team2.logo = "http://example.com"
team2.members = 1

print(team.__dict__ == team2.__dict__)

以上將打印True (您可以輕松地為Team實例重載==運算符,並在您說team == team2時讓 Python 做正確的事情,但默認情況下不會發生這種情況。)


我在上面的答案中遺漏了一件事。 如果你在__init__()函數上做可選參數的事情,如果你想提供一個“可變”作為可選參數,你需要小心。

整數和字符串是“不可變的”。 你永遠不能就地改變它們; 相反,Python 會創建一個新對象並替換您之前擁有的對象。

列表和字典是“可變的”。 您可以永遠保留同一個對象,向其中添加或從中刪除。

x = 3   # The name "x" is bound to an integer object with value 3
x += 1  # The name "x" is rebound to a different integer object with value 4

x = []  # The name "x" is bound to an empty list object
x.append(1)  # The 1 is appended to the same list x already had

您需要知道的關鍵是:在編譯函數時,可選參數只計算一次。 因此,如果您在類的__init__()中將可變參數作為可選參數傳遞,那么您的類的每個實例共享一個可變對象。 這幾乎永遠不是您想要的。

class K(object):
    def __init__(self, lst=[]):
        self.lst = lst

k0 = K()
k1 = K()

k0.lst.append(1)

print(k0.lst)  # prints "[1]"
print(k1.lst)  # also prints "[1]"

k1.lst.append(2)

print(k0.lst)  # prints "[1, 2]"

解決方法很簡單:

class K(object):
    def __init__(self, lst=None):
        if lst is None:
            self.lst = []  # Bind lst with a new, empty list
        else:
            self.lst = lst # Bind lst with the provided list

k0 = K()
k1 = K()

k0.lst.append(1)

print(k0.lst)  # prints "[1]"
print(k1.lst)  # prints "[]"

這種使用默認參數值None ,然后測試傳遞的參數is None ,符合 Python 設計模式,或者至少是您應該掌握的習語。

class Team:
  def __init__(self):
    self.name = None
    self.logo = None
    self.members = 0

在 Python 中,您通常不會編寫 getter 和 setter,除非您確實對它們有一個重要的實現(此時您使用屬性描述符)。

要編寫類,您通常會執行以下操作:

class Person:
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height

要實例化一個類的實例,你會這樣做

person1 = Person("Oscar", 40, "6ft")

person2 = Team("Danny", 12, "5.2ft")

您還可以設置默認值:

 class Person:
        def __init__(self):
            self.name = "Daphne"
            self.age = 20
            self.height = "5.4ft"

要實例化這樣的類集,您需要執行以下操作:

person3 = Person()
person3.name = "Joe"
person3.age = 23
person3.height = "5.11ft"

您會注意到此方法與您典型的 Python 字典交互有很多相似之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM