Python中创建类的六重境界

时间:2022-11-26 13:59:56

1. 引言

大家首先需要记住一句话:类是模板,而实例则是根据类创建的对象。在面向对象编程语言中,类class最为常见。为此,本文重点来介绍在Python中创建类的六重境界。 闲话少说,我们直接开始吧!

2. Level 1: Basic class

在Python中,类通过 class 关键字定义,最简单的创建类的代码样例如下:

class Dog:
pass
dog = Dog() # initializing

3. Level 2: Basic class with basic method

我们这里不在直接使用关键字​​pass​​,在类内什么都不做。因此,我们可以考虑通过添加相应的成员函数来实现相应的功能,样例代码如下:

class Dog:
def bark(self):
print("woof")
dog = Dog()
dog.bark() # woof

4. Level 3: Basic class with init method

接着让我们在类内添加一个​​__init__​​魔法方法,首先需要理解的是,两个下划线开头的函数是声明该属性为类内私有函数,同时​​__init__​​函数支持带参数类的初始化,也可为声明该类的属性(类中的变量)。 样例代码如下:

class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print("woof)
dog1 = Dog("rocky", 4) # name="rocky" age=4
dog2 = Dog("lucky", 5) # name="lucky" age=5

5. Level 4: Class that inherits from another class

通过使用类​​Dog(Animal)​​语法,我们可以使​​Dog​​类继承父类​​Animal​​类。这意味着​​Dog​​类可以访问父类​​Animal​​类中的任何属性或方法。

样例代码如下:

class Animal:
def speak(self):
print("hello")
class Dog(Animal):
pass
dog = Dog()
dog.speak() # hello

6. Level 5: Class that inherits from another class with init

如果我们的子类与父类有不同的​​__init__​​函数,此时我们可以在子类中使用​​super().__init__​​。这实际上是在子类中的​​__init__​​函数中调用父类中的​​__init__​​函数。

样例代码如下:

class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
class Square(Rectangle):
def __init__(self, length):
super().__init__(length, length) # Rectangle's __init__

上述代码中,在类​​Square​​的​​__init__​​函数中,我们使用​​super().__init__​​函数,本质上是调用父类​​Rectangle​​中的​​__init__​​函数。由于正方形中的长度等于宽度,所以这里我们将​​length​​传递给​​super().__init__​​两次。 示例代码如下:

r = Rectangle(5, 4)
r.area() # 20
s = Square(3)
s.area() # 9

7. Level 6: Dataclasses

什么?你说在定义类的时候经常忘记写函数​​__init__​​,此时我们不妨来使用dataclass。样例代码如下:

from dataclasses import dataclass
@dataclass
class Dog:
name: str
age: int
def bark(self):
print(f"woof name={self.name} age={self.age}")
dog = Dog("rocky", 4)
dog.bark() # woof name=rocky age=4

是不是敲方便?


8. 总结

本文重点介绍了在Python中创建类的六重境界,并给出了相应的代码示例。

您学废了嘛?