Object Oriented Programming

2024-01-28

From: Object-Oriented Programming (OOP) in Python 3 – Real Python

  • 定义一个类,它就像是创建对象的蓝图

  • 使用类创建新对象

  • 具有类继承功能的模型系统

管理代码的困难

kirk = ["James Kirk", 34, "Captain", 2265]
spock = ["Spock", 35, "Science Officer", 2254]
mccoy = ["Leonard McCoy", "Chief Medical Officer", 2266]

首先,它会使较大的代码文件更难管理。因为 List 用索引管理成员,而人很难记住名字,年龄在哪个字段。

其次,如果员工各自列表中的元素数量不一致,就会产生错误。

类允许你创建用户定义的数据结构。类定义了称为方法的函数,这些方法确定了根据类创建的对象可以对其数据执行的行为和操作。

类与实例

定义一个类

instance attributes : 在 .__init__() 中创建的属性称为实例属性。实例属性的值是类的特定实例所特有的。

class attributes : 类属性是对所有类实例具有相同值的属性。您可以通过在 .__init__() 之外为变量名赋值来定义类属性。

# dog.py

class Dog:
    species = "Canis familiaris"

    def __init__(self, name, age):
        self.name = name
        self.age = age

实例化

>>> miles = Dog("Miles", 4)
>>> buddy = Dog("Buddy", 9)

可以用一个类创建很多个相似的实例,这是类最基本的优势。

访问实例

>>> miles.name
'Miles'
>>> miles.age
4

>>> buddy.name
'Buddy'
>>> buddy.age
9

>>> miles.species
>>> buddy.species

使用类来组织数据的最大优势之一,就是可以保证实例具有你所期望的属性。

Instance Methods

# dog.py

class Dog:
    species = "Canis familiaris"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    # Instance method
    def description(self):
        return f"{self.name} is {self.age} years old"

    # Another instance method
    def speak(self, sound):
        return f"{self.name} says {sound}"

test:

>>> miles = Dog("Miles", 4)

>>> miles.description()
'Miles is 4 years old'

>>> miles.speak("Woof Woof")
'Miles says Woof Woof'

>>> miles.speak("Bow Wow")
'Miles says Bow Wow'

__str__()

更加友好的打印对象:

>>> print(miles)  #=  <__main__.Dog object at 0x00aeff70>

增加 ## __str__ 方法,

# dog.py

class Dog:
    # ...

    def __str__(self):
        return f"{self.name} is {self.age} years old"

再次打印 Dog 对象:

>>> miles = Dog("Miles", 4)
>>> print(miles)   #= 'Miles is 4 years old'

如何继承

over ridden

# inheritance.py

class Parent:
	species = "Dog"
    hair_color = "brown"

class Child(Parent):
    hair_color = "purple"    # over ride

Child 拥有和 Parent 相同的 species, 但却拥有自己独特的 hair color。

extended

# inheritance.py

class Parent:
    speaks = ["English"]

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.speaks.append("German")

练习

创建一个新类JackRussellTerrier ,它继承于 Dog,当不给 speak 参数时,它发出 Arf 的声音, 但传入 sound 参数时,按 sound 提示发声。

# dog.py

class JackRussellTerrier(Dog):
    def speak(self, sound="Arf"):
        return f"{self.name} says {sound}"

Reference

When Should You Use .repr() vs .str() in Python? – Real Python