Python 是一种面向对象的编程语言,面向对象编程(OOP)允许我们通过“类”来组织代码,实现封装、继承和多态。
1. 定义类
在 Python 中,类是通过 class 关键字定义的。类定义中包含了属性(成员变量)和方法(成员函数)。类的定义通常以 class 关键字开头。
class Dog:pass # 空类
2. 类的构成
类主要由两部分构成:
- 属性(成员变量):存储对象的数据。
- 方法(成员函数):定义类的行为,操作对象的数据。
class Dog:# 属性species = "Canis familiaris" # 类属性# 方法def __init__(self, name, age):# 实例属性self.name = nameself.age = agedef bark(self):return f"{self.name} says Woof!"
- 类属性:属于整个类,而不是单个实例对象。类属性对所有实例对象共享。
- 实例属性:属于具体的实例对象,每个实例都有独立的属性。
- 方法:函数属于类,它们可以访问类的属性,进行具体的操作。
3. __init__() 方法
__init__() 方法是类的构造方法,在创建对象时自动调用。它用于初始化对象的属性。每次创建对象时,__init__() 方法都会被执行。
class Dog:def __init__(self, name, age):self.name = name # 实例属性self.age = age # 实例属性
__init__()是一个特殊方法,作为初始化方法,它接收至少一个参数(self),并且一般用于初始化对象的属性。self是一个指向实例对象的引用,表示当前正在创建的对象。
4. 创建对象
要创建一个对象,我们只需通过类名并传递相应的参数来调用类的构造函数 __init__()。
my_dog = Dog("Buddy", 3) # 创建对象,并传递参数
print(my_dog.name) # 输出:Buddy
print(my_dog.age) # 输出:3
my_dog是一个对象,它是Dog类的实例。my_dog.name和my_dog.age分别是Dog类的实例属性。
5. 理解 self
在类定义中的方法中,self 是必须的,并且表示当前对象的实例。在方法被调用时,self 会自动指向调用该方法的对象实例,允许方法访问该对象的属性和其他方法。
class Dog:def __init__(self, name, age):self.name = name # 设置实例属性self.age = age # 设置实例属性def description(self):# 访问实例属性return f"{self.name} is {self.age} years old."def speak(self, sound):# 访问实例属性并执行方法return f"{self.name} says {sound}"
my_dog = Dog("Buddy", 3)
print(my_dog.description()) # 输出:Buddy is 3 years old.
print(my_dog.speak("Woof")) # 输出:Buddy says Woof
self使得方法能够访问该实例的属性和其他方法。my_dog.description()调用时,self被自动赋值为my_dog对象,方法可以访问my_dog的name和age属性。
6. 类的继承
继承是面向对象编程中的一个重要概念,它允许我们创建一个类,并从另一个类继承属性和方法。
class Animal:def __init__(self, name):self.name = namedef speak(self):return f"{self.name} makes a sound."class Dog(Animal): # 继承自Animal类def speak(self):return f"{self.name} barks."my_dog = Dog("Buddy")
print(my_dog.speak()) # 输出:Buddy barks.
Dog类继承了Animal类的name属性和__init__方法,同时也重写了speak()方法。
7. 类的封装
封装是将对象的状态(属性)和行为(方法)包装在一起,并且控制外部代码访问对象内部的实现细节。可以通过属性前加双下划线(__)来实现私有化,使外部无法直接访问。
class Dog:def __init__(self, name, age):self.name = nameself.__age = age # 私有属性def get_age(self):return self.__age # 提供一个方法来访问私有属性def set_age(self, age):if age > 0:self.__age = ageelse:print("Age must be positive.")
my_dog = Dog("Buddy", 3)
print(my_dog.get_age()) # 输出:3
my_dog.set_age(4) # 设置新年龄
print(my_dog.get_age()) # 输出:4
__age是私有属性,不能直接从外部访问。get_age()和set_age()方法是公开的,可以访问和修改私有属性。
总结
- 定义类:通过
class关键字定义类,类包含属性和方法。__init__()方法:构造函数,初始化对象的属性,self指代当前对象。- 创建对象:通过类名调用构造方法创建实例。
self:指代当前对象的实例,允许访问实例的属性和方法。- 继承:子类可以继承父类的属性和方法,且可以重写父类方法。
- 封装:通过将属性设为私有(双下划线)来保护对象内部数据,并通过公开方法访问。
