成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python必知必會:令人相見恨晚的十個Python類技巧

開發 前端
我們給 super().__init__? 方法傳遞了 (length, length) 參數,因為正方形的長寬相等。同時,我們可以調用父類計算面積和周長的方法,因為子類可以訪問父類的方法。這樣,不僅提升了代碼的復用性,并且代碼更簡潔。

前路漫漫,我愛Python。Hello,大家好!今天筆者將向大家分享10個關于Python類的關鍵技巧,早點了解這些技巧有助于你寫出更加優雅、高效和Pythonic的代碼!

1. 繼承(Inheritance)VS 組合(Composition)

有時候我們應該使用繼承,有時應該使用組合。實際應用中應該如何選擇呢?一起來看看。

繼承應該用在 IS-A 關系中。比如,猴子是一種動物,圓是一種形狀,小轎車是一種機動車。在Python面向對象編程中,可以像下面這樣表達 IS-A 關系:

  • Monkey 繼承自 Animal 類
  • Circle 類繼承自 Shape 類
  • Car 類繼承自 Vehicle 類

圖片圖片

組合應該用在 HAS-A (或HAS-MANY) 關系中。比如,一只猴子有一個主人,一張轎車有一個引擎,一個公司有一個或多個員工。

相反,一只猴子不是一個主人,一張轎車不是一個引擎,一個公司不是一個員工。并且,從常識來看,這樣表達也不合理。我們不能使用繼承來表示這些關系——而是應該使用組合。

圖片圖片

請注意,此處并沒有繼承關系。相反,Monkey 對象包含了 Owner 對象,Car 對象包含了 Engine 對象,Company 對象包含了 Employee 對象。

對于繼承和組合的選擇需要格外謹慎,因為錯誤的選擇可能會給你的項目帶來意想不到的麻煩。

2. super()方法及其用途

super() —— 當用在類中時,它允許我們訪問父類的方法。

假設我們有2個類:矩形(Rectangle)和正方形(Square)。我們都知道,正方形其實是一種特殊的矩形(即長寬相等)。因此,我們可以通過繼承 Rectangle 類來創建 Square 類。這樣,Rectangle 類是父類,而 Square 類則是子類。我們首先定義 Rectangle 類:

class Rectangle:
    def __init__(self, length: float, width: float):
        self.length = length
        self.width = width

    def area(self):
        return self.length * self.width

    def perimeter(self):
        return 2 * (self.length + self.width)

if __name__ == '__main__':
    r = Rectangle(length=10.5, width=6.4)
    print(r.area())         # 67.2
    print(r.perimeter())    # 33.8

接下來,我們定義 Square 類,它繼承自 Rectangle 類。注意,為了盡可能復用現有的方法(來自父類),我們就會用到 super() 方法。

class Square(Rectangle):
    def __init__(self, length: float):
        super().__init__(length, length)

if __name__ == '__main__':
    s = Square(5)
    print(s.area())         # 25
    print(s.perimeter())    # 20

這里,super() 指的是父類(即 Rectangle)。因此,super().__init__ 實際上就是在調用父類 Rectangle 的 __init__ 方法。

我們給 super().__init__ 方法傳遞了 (length, length) 參數,因為正方形的長寬相等。同時,我們可以調用父類計算面積和周長的方法,因為子類可以訪問父類的方法。這樣,不僅提升了代碼的復用性,并且代碼更簡潔。

3. 實例方法 VS 類方法 VS 靜態方法

實例方法(Instance methods)屬于類(對象)的實例,它可以訪問實例的屬性。

例如,在下面的代碼片段中,intro 就是 Dog 類的實例方法。

class Dog:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age

    def introduce(self):
        print(f'My name is {self.name}!')

if __name__ == '__main__':
    rocky = Dog(name='Rocky', age=20)
    rocky.introduce()   # My name is Rocky!

類方法(Class methods)屬于類(而不是實例),并且類方法只能訪問類屬性,而不能訪問實例屬性。

比如,在下面的示例中,get_employee_count 就是 Employee 類的一個類方法:

class Employee:
    employee_count: int = 0

    @classmethod
    def get_employee_count(cls) -> int:
        return cls.employee_count

    def __init__(self, name: str, salary: int) -> None:
        self.name = name
        self.salary = salary
        Employee.employee_count += 1

if __name__ == '__main__':
    emp1 = Employee(name='John', salary=5000)
    emp2 = Employee(name='Jack', salary=10000)
    emp3 = Employee(name='Stefan', salary=8000)

    print(Employee.get_employee_count())    # 3

關于類方法:

  • 我們使用 @classmethod 裝飾器來表示定義類方法。
  • 類方法接受的是 cls 參數而不是 self, cls 表示類本身(這里為 Employee)。
  • 類方法(get_employee_count)只能訪問類屬性(如employee_count),而不能訪問實例屬性(如name, salary)。

靜態方法(Static methods)屬于類,它無法訪問任何屬性。

例如,在下面的示例中,description 就是 Employee 類的靜態方法:

class Employee:
    def __init__(self, name: str, salary: int) -> None:
        self.name = name
        self.salary = salary

    @staticmethod
    def description() -> str:
        return 'Employees are the most basic and important resources for company.'

if __name__ == '__main__':
    print(Employee.description())
    # Employees are the most basic and important resources for company.

關于靜態方法:

  • 我們通過 @staticmethod 裝飾器來定義靜態方法。
  • 請注意,靜態方法不接受 cls 或 self 參數。
  • 靜態方法不能訪問任何屬性,包括類屬性和實例屬性。

4. 數據類(Dataclasses)

當我們需要創建具有許多簡單屬性的類時,使用數據類(dataclass)會尤其有用。比如,

from dataclasses import dataclass

@dataclass
class Employee:
    name: str           # 姓名
    age: int            # 年齡
    gender: str         # 性別
    education: str      # 學歷
    telphone: str       # 電話
    email: str          # 郵箱
    position: str       # 職位
    salary: int         # 薪資
    seniority: int      # 工齡

    def description(self) -> str:
        return f"""The description of employee:
        Name: {self.name} 
        Age: {self.age}
        Gender: {self.gender}
        Education: {self.education}
        Telephone: {self.telphone}
        Email: {self.email}
        Position: {self.position}
        Salary: {self.salary}
        Seniority: {self.seniority}
        """

if __name__ == '__main__':
    emp_info: list[str | int] = ['Jack', 29, 'Male', 'master', '188******666',
                                 'jackzhang@example.com', 'manager', 10000, 5]
    emp = Employee(*emp_info)
    print(emp.description())

圖片圖片

注意,我們不需要在數據類中編寫 __init__ 方法,因為它已經為我們自動編寫該方法。

此外,請注意,如果你需要在 __init__ 方法中執行一些特定的操作,那么可能使用數據類并不合適。

5.__dict__屬性

當我們創建類的實例后,實際上實例對象的屬性在底層存在一個特殊變量中(即__dict__),我們可以使用它來獲取實例的屬性信息。

class Employee:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

if __name__ == '__main__':
    emp = Employee(name="John", age=20)
    print(emp.__dict__)
    # {'name': 'John', 'age': 20}

即使是動態添加的屬性,也可以通過對象的 __dict__ 屬性獲取:

class Employee:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

if __name__ == '__main__':
    emp = Employee(name="John", age=20)
    print(emp.__dict__)
    # {'name': 'John', 'age': 20}
    emp.salary = 10000
    print(emp.__dict__)
    # {'name': 'John', 'age': 20, 'salary': 10000}

如果我們希望調試和檢查具有許多屬性的復雜對象和類,這非常有用。

責任編輯:武曉燕 來源: 數據派探險家
相關推薦

2024-09-05 16:02:52

Python數據類型字符串

2021-04-14 09:22:18

Python技巧交換變量值

2019-08-09 14:13:22

Python知乎程序員

2017-06-01 09:34:55

R語言包sqldf

2021-09-28 14:40:03

Python內置庫itertools

2024-08-20 14:25:20

2018-01-25 14:53:20

iPhone技巧刪除照片

2021-08-20 15:43:54

iPhone手機iOS

2020-05-06 09:18:56

Pandas函數大數據技術

2015-07-14 14:09:56

2024-01-29 00:51:39

前端開發利器

2021-08-19 15:02:32

科技軟件電腦

2020-05-07 09:02:55

代碼Python開發

2024-01-23 18:49:38

SQL聚合函數數據分析

2020-08-23 18:18:27

Python列表數據結構

2025-03-24 01:00:00

2016-12-09 12:50:36

Android

2023-09-20 22:52:12

Kubernetes快捷方式

2020-04-01 14:16:05

Pandastips數據分析

2019-07-05 07:49:19

TCPIP網絡協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品乱码久久久久久久久久 | 精品久久久久久久人人人人传媒 | 亚洲一区视频在线播放 | 久久看精品 | 欧美精品一二三区 | 毛片国产 | 精品国产一区二区三区观看不卡 | 久久精品| 国产精品久久久久无码av | 丁香五月网久久综合 | 国产精品一区二区不卡 | 久久久久久黄 | 久久草在线视频 | 国产一在线 | 欧美成人一区二免费视频软件 | av黄色免费在线观看 | 黄色一级片视频 | 国产欧美一区二区在线观看 | 羞羞在线视频 | 老司机67194精品线观看 | 中文字字幕一区二区三区四区五区 | 精品视频在线播放 | 国产成人99av超碰超爽 | 先锋资源网站 | 成人在线一区二区三区 | 欧美中文字幕一区二区三区亚洲 | 国产一区二区三区视频在线观看 | 亚洲国产精品一区二区久久 | 免费污视频 | 国产成人精品久久 | 一区在线播放 | 黄色毛片在线播放 | 日韩高清中文字幕 | 91av免费版| 国产精品久久久久久久免费大片 | 亚洲精品精品 | 亚洲一区二区三区四区五区午夜 | 国产99视频精品免费播放照片 | 欧美日韩不卡合集视频 | 亚洲欧美日本国产 | 性一爱一乱一交一视频 |