类和对象
概念简介
- 类(class): 用来描述具有咸通的属性和方法的集合。它定义了该集合中每个对象所共有的属性和方法。
- 方法: 类中定义的函数。
- 类变量: 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员: 类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写: 如果说从父类继承的方法不能满足子类的需求,那么可以对其进行改写,这个过程叫做方法的覆盖(override),也称为方法的
重写。 - 局部变量: 定义在方法中的变量,只作用于当前实例的类。
- 实例变量: 在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用self修饰的变量。
- 继承: 即一个派生类(deviced class) 继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
- 实例化: 创建一个类的实例,类的具体对象。
- 对象: 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
和其它的编程语言相比较,Python在尽可能不增加新语法和语义的情况下加入了类机制。
Python中的类提供了面向对象编程的基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
class SegFormerHead:
......
# 具体的内容,包括变量和方法
上述声明的类实体化之后,我们可以通过雷鸣访问其属性,并且可以调用其中的函数。
类对象
类对象支持两种操作:属性引用和实例化。
属性引用使用和Python中所有属性引用一样的标准语法:obj.name
。
类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样:
class MyClass:
a = 123
def f(self):
return 'hello world!'
# 实例化对象
myObject = MyClass()
# 访问类的属性和方法
print(myObject.a) # 访问的是类的属性
print(myObject.f) # 访问的是类的方法
构造方法
Pyhon中也有自己的构造方法:__init__()
该方法用于在创建对象时初始化对象的属性。
该方法(__init__
)在实例化时会自动调用,通过构造函数,我们可以为对象设置初始状态,病传递参数给对象的属性。
例如:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display_info(self):
print(f"Name: {self.name}, Age: {self.age}")
# 创建一个 Person 对象实例
person1 = Person("Alice", 30)
person1.display_info()
# 创建另一个 Person 对象实例
person2 = Person("Bob", 25)
person2.display_info()
在上面的例子中,我们定义了一个 Person
类,其中包含一个构造函数 __init__()
,它接受 name
和 age
作为参数,并将它们存储为对象的属性。我们通过调用 Person
类的构造函数来创建两个不同的 Person
对象实例:person1
和 person2
,并分别输出它们的信息。
构造函数__init__()
的作用是初始化对象的属性,为对象提供初始状态,他在创建对象实例时自动调用,并允许我们对对象进行必要的初始化操作。通过构造函数,我们可以方便地传递参数给对象,使对象的每个实例在创建时都具有有不同的属性值,从而使想对象的“个性化定制”。
self
在Python中,类里面的方法通常会有一个特殊的参数self
,它代表当前对象实例自身。self
参数是Python中用来引用对象自身的约定,它的作用是方法内部访问对象的属性和其他方法。
当我们调用对象的方法时,Python会自动将方法所属的对象(即调用该方法的对象实例)作为第一个参数传递给方法。习惯上,我们使用self
来表示这个参数,但是实际上我们可以使用任何合法的变量名。但是,强烈建议使用self
,因为它是一种通用的约定,有助于提高代码的可读性,并且符合Python社区的习惯。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display_info(self):
print(f"Name: {self.name}, Age: {self.age}")
def celebrate_birthday(self):
self.age += 1
print(f"{self.name} is celebrating their birthday! Now they are {self.age} years old.")
# 创建一个 Person 对象实例
person1 = Person("Alice", 30)
# 调用对象的方法
person1.display_info() # 输出:Name: Alice, Age: 30
# 调用对象的方法,其中方法内部使用了 self
person1.celebrate_birthday() # 输出:Alice is celebrating their birthday! Now they are 31 years old.
person1.display_info() # 输出:Name: Alice, Age: 31
类的方法
在类的内部,使用def
关键字来定义一个方法,与一般的函数定义不同,类方法必须包含参数self
,并且是第一个参数,self
代表的是类的实例。
Python中类的方法分为:实例方法、类方法、静态方法。
- 实例方法(Instance Method)
- 实例方法是最常见的类方法,在定义时第一个参数一般为
self
,用于表示当前对象实例; - 通过实例方法,我们可以操作对象的属性,调用其他方法,以及实现对象的行为
- 实例方法通过对象实例来调用,Python会自动将对象实例传递给方法的
self
参数
- 实例方法是最常见的类方法,在定义时第一个参数一般为
- 类方法(Class Method):
- 类方法使用装饰器
@classmethod
来定义,第一个参数一般为cls,用来表示类本身; - 类方法可以访问类的属性和方法,但是不能直接访问对象实例的属性;
- 类方法通过类本身来调用,Python会自动将类本身传递给方法的
cls
参数。
- 类方法使用装饰器
- 静态方法(Static Method):
- 静态方法使用装饰器
@staticmethod
来定义,不需要特定的参数来表示对象实例或类本身; - 静态方法与类和对象实例无关,可以作为纯粹的工具函数存在,不依赖于类属性或实例属性。
- 静态方法使用装饰器
class Circle:
pi = 3.14
def __init__(self, radius):
self.radius = radius
# 实例方法
def calculate_area(self):
return self.pi * self.radius ** 2
# 类方法
@classmethod
def set_pi(cls, new_pi):
cls.pi = new_pi
# 静态方法
@staticmethod
def convert_to_diameter(radius):
return radius * 2
# 创建一个 Circle 对象实例
circle = Circle(5)
# 调用实例方法
print(circle.calculate_area()) # 输出:78.5
# 调用类方法
Circle.set_pi(3.14159)
print(circle.pi) # 输出:3.14159
# 调用静态方法
diameter = Circle.convert_to_diameter(5)
print(diameter) # 输出:10
类方法和静态方法在Python中相对少用,但是它们具有一些特定的应用场景和优点:
类方法(Class Method)的应用场景和优点:
- 工厂方法模式: 类方法可用于构建和返回新的实例,对于工厂方法模式是一种常见的应用场景;
- 类级别的操作: 当需要在类级别执行操作,而不是在实例级别时,类方法可以派上用场,比如修改类属性、提供对类的访问限制等;
- 提高灵活性: 类方法可以使用类本身作为对象,从而提高了方法的灵活性,使得在修改类名时不需要修改相关的类方法。
静态方法(Static Method)的应用场景和有点
- 独立功能: 静态方法是在类中组织函数的一种形式,它以类的名义空间存在,但是与类及其实例无关,适用于一些不需要访问类属性或实例属性的独立功能。
- 逻辑上的归属: 静态方法可以提高代码的组织性和可维护性,将一些独立的函数放入类的命名空间中,使程序结构更加清晰。
- 代码结构: 静态方法可以提高代码的组织性和可维护性,将一些独立的函数放入类的命名空间中,使程序结构更加清晰。
虽然说类方法和静态方法相对不太常用,但是他们在特定场景下仍然能够提供一些额外的功能和特性。在具体的使用过程中,需要依据具体的需求来选择使用。