Python类和对象
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程。接下来我们先来简单的了解下面向对象的一些基本特征。
1、面向对象技术简介
**类(Class):**用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
**方法:**类中定义的函数。
**类变量:**类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
**数据成员:**类变量或者实例变量用于处理类及其实例对象的相关的数据。
**方法重写:**如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
**局部变量:**定义在方法中的变量,只作用于当前实例的类。
**实例变量:**在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
**继承:**即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
**实例化:**创建一个类的实例,类的具体对象。
**对象:**通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。
2、类和对象的基础语法
2.1、类的定义
类是一种自定义数据类型,用于创建对象。
类定义了对象的属性(数据成员)和方法(函数成员)。
通过
class
关键字定义类。
示例代码:
pythonclass Person: def __init__(self, name, age): self.name = name self.age = age def introduce(self): print(f"My name is {self.name} and I am {self.age} years old.")
2.2、对象
对象是类的实例,具有类定义的属性和方法。
通过调用类的构造函数来创建对象。
每个对象都有自己的状态,但共享相同的方法定义。
示例代码:
pythonclass Person: def __init__(self, name, age): self.name = name self.age = age def introduce(self): print(f"My name is {self.name} and I am {self.age} years old.") person1 = Person("Alice", 25) person2 = Person("Bob", 30)
2.3、self
self
是类方法的第一个参数,用于引用对象本身。
self
不是Python关键字,但是约定俗成的命名,可以使用其他名称代替,但通常不建议。
示例代码:
pythondef __init__(self, name, age): self.name = name self.age = age
3、属性和方法
3.1、属性
属性是对象的特征或数据成员,用于存储对象的状态信息。
可以通过点运算符访问或修改属性。
示例代码:
pythonprint(person1.name) # 输出:"Alice" print(person2.age) # 输出:30
3.2、方法
方法是类中定义的函数成员,用于执行特定操作。
方法通常与对象相关联,并可以访问对象的属性。
示例代码:
pythondef introduce(self): print(f"My name is {self.name} and I am {self.age} years old.")
3.3、类方法
类方法, 使用**@classmethod
装饰器来定义类方法** 。类方法是与类关联的方法,而不是与实例关联的方法。这意味着类方法可以在不创建类的实例的情况下调用,并且通常用于执行与类本身相关的操作。类方法的第一个参数通常被命名为cls
,表示类本身。
pythonclass MyClass: class_variable = 0 # 类变量 def __init__(self, instance_variable): self.instance_variable = instance_variable @classmethod def class_method(cls, x): cls.class_variable += x print(f"This is a class method. class_variable: {cls.class_variable}") def instance_method(self): print(f"This is an instance method. instance_variable: {self.instance_variable}") # 创建类的实例 obj1 = MyClass(10) obj2 = MyClass(20) # 调用类方法,不需要创建实例 MyClass.class_method(5)#This is a class method. class_variable: 5 # 访问类变量 print(MyClass.class_variable) # 输出:5 # 调用实例方法 obj1.instance_method()# This is an instance method. instance_variable: 10
在上面的示例中,class_method
是一个类方法,它可以在不创建MyClass
的实例的情况下被调用。类方法通过cls
参数访问类级别的属性(如class_variable
),而实例方法通过self
参数访问实例级别的属性(如instance_variable
)。
3.4、构造方法
构造方法是类中的特殊方法,以__init__
命名,用于在创建对象时初始化对象的属性。
pythondef __init__(self, name, age): self.name = name self.age = age
3.5、静态方法
在Python中,静态方法(Static Method)是类中的一个函数,它既不接收类对象(cls
)作为第一个参数,也不接收实例对象(self
)作为第一个参数。这意味着静态方法无法直接访问类属性或实例属性。静态方法使用@staticmethod
装饰器来定义。它们主要用于那些逻辑上与类相关,但实际上并不需要访问类属性或实例属性的场景。静态方法可以被视为类命名空间中的普通函数,只是它们通过类来组织,并且可以通过类名或实例名来调用。下面是一个包含静态方法的Python类的示例:
pythonclass A: class_attr = 42 # 类属性 def __init__(self, value): self.instance_attr = value # 实例属性 @staticmethod def myadd(a, b): # 只能访问传递的参数,不能访问类属性和实例属性 return a + b # 创建类实例 a = A(10) # 调用静态方法 print(A.myadd(100, 200)) # 输出: 300 print(a.myadd(300, 400)) # 输出: 700
下面实例一个所有方法都用到的类
pythonclass MyClass: # 类属性 class_attribute = "I am a class attribute" def __init__(self, instance_value): """构造方法,用于初始化实例属性""" self.instance_attribute = instance_value # 实例属性 def instance_method(self): """实例方法,可以访问实例属性和类属性""" print(f"Instance attribute: {self.instance_attribute}") print(f"Class attribute: {MyClass.class_attribute}") @classmethod def class_method(cls): """类方法,只能访问类属性,不能访问实例属性""" print(f"Class method called. Class attribute: {cls.class_attribute}") @staticmethod def static_method(): """静态方法,不能访问实例属性和类属性(但可以通过类名或实例名间接访问,不推荐)""" print("Static method called. It cannot directly access instance or class attributes.") # 下面的行展示了如何通过类名间接访问类属性(不推荐) # print(MyClass.class_attribute) # 示例使用 if __name__ == "__main__": # 创建MyClass的实例 my_instance = MyClass("This is an instance value") # 调用实例方法 my_instance.instance_method() # 调用类方法 MyClass.class_method() # 也可以通过实例调用类方法(但不推荐) # my_instance.class_method() # 调用静态方法 MyClass.static_method() # 也可以通过实例调用静态方法(但不推荐) # my_instance.static_method()