python类方法、实例方法以及相互关系

[复制链接]
发表于 2025-12-31 00:07:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在Python中,类方法(class method)是一种特别范例的方法,它利用类本身作为第一个参数,而不是实例对象。类方法通常用于界说与类本身相干但不须要访问实例属性的利用。类方法的第一个参数通常定名为cls,以区别于实例方法的第一个参数self。
要界说一个类方法,你须要利用@classmethod装饰器。以下是一个简朴的例子:
  1. [/code]python复制代码
  2. [table][tr][td][/td][td]class MyClass: [/td][/tr][tr][td][/td][td]_class_variable = 0 # 类变量 [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]def __init__(self, value): [/td][/tr][tr][td][/td][td]self.instance_variable = value # 实例变量 [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]@classmethod [/td][/tr][tr][td][/td][td]def increment_class_variable(cls): [/td][/tr][tr][td][/td][td]cls._class_variable += 1 [/td][/tr][tr][td][/td][td]print(f"Class variable after increment: {cls._class_variable}") [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]def increment_instance_variable(self): [/td][/tr][tr][td][/td][td]self.instance_variable += 1 [/td][/tr][tr][td][/td][td]print(f"Instance variable after increment: {self.instance_variable}") [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]# 利用类方法 [/td][/tr][tr][td][/td][td]MyClass.increment_class_variable() # 不须要实例化对象 [/td][/tr][tr][td][/td][td]MyClass.increment_class_variable() # 再次调用类方法 [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]# 实例化对象并利用实例方法 [/td][/tr][tr][td][/td][td]instance = MyClass(10) [/td][/tr][tr][td][/td][td]instance.increment_instance_variable() # 调用实例方法 [/td][/tr][tr][td][/td][td]instance.increment_instance_variable() # 再次调用实例方法[/td][/tr][/table]在这个例子中:
  3. [list=1]
  4. [*]MyClass有一个类变量_class_variable和一个实例变量instance_variable。
  5. [*]increment_class_variable是一个类方法,它利用cls作为第一个参数来访问和修改类变量_class_variable。
  6. [*]increment_instance_variable是一个实例方法,它利用self作为第一个参数来访问和修改实例变量instance_variable。
  7. [/list]注意,类方法可以通过类名直接调用,而不须要创建类的实例。实例方法则必须通过类的实例来调用。
  8. [size=3]何时利用类方法[/size]
  9. 类方法通常用于以了局景:
  10. [list=1]
  11. [*][b]工厂方法[/b]:创建并返回类的实例,但答应子类重写这些方法来返回差别的实例范例。
  12. [*][b]替换全局函数[/b]:当函数与类细密相干,但不须要访问实例属性时,可以利用类方法。
  13. [*][b]实现替换构造函数[/b]:在某些环境下,你大概盼望提供多个构造函数,这时可以利用类方法。
  14. [/list][size=3]示例:工厂方法[/size]
  15. [code]
复制代码
python复制代码
class Shape:
@classmethod
def create_shape(cls, shape_type):
if shape_type == "circle":
return Circle()
elif shape_type == "square":
return Square()
else:
raise ValueError("Unknown shape type")
class Circle(Shape):
def draw(self):
print("Drawing a circle")
class Square(Shape):
def draw(self):
print("Drawing a square")
# 利用工厂方法创建形状
circle = Shape.create_shape("circle")
circle.draw() # 输出: Drawing a circle
square = Shape.create_shape("square")
square.draw() # 输出: Drawing a square
在这个例子中,Shape类有一个类方法create_shape,它根据传入的shape_type返回差别的形状实例。

在Python中,实例可以调用类方法,但类通常不能直接调用实例方法,由于实例方法须要一个实例对象作为它们的第一个参数(通常是self)。下面我将具体表明这两种环境。
实例调用类方法

实例可以调用类方法,由于类方法是通过类本身作为第一个参数(通常是cls)来界说的,而不是通过实例对象。然而,当实例调用类方法时,Python会自动将类作为第一个参数通报给类方法,而不是实例对象本身。但是,在类方法内部,你仍旧可以通过其他方式访问实例的属性或方法,只管这不是类方法的典范用途。
  1. [/code]python复制代码
  2. [table][tr][td][/td][td]class MyClass: [/td][/tr][tr][td][/td][td]_class_variable = 0 [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]@classmethod [/td][/tr][tr][td][/td][td]def class_method(cls): [/td][/tr][tr][td][/td][td]print(f"Class variable: {cls._class_variable}") [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]# 创建实例 [/td][/tr][tr][td][/td][td]instance = MyClass() [/td][/tr][tr][td][/td][td][/td][/tr][tr][td][/td][td]# 实例调用类方法 [/td][/tr][tr][td][/td][td]instance.class_method() # 输出: Class variable: 0[/td][/tr][/table]在这个例子中,instance.class_method()调用是有效的,由于Python知道class_method是一个类方法,并将MyClass作为cls参数通报给它。
  3. [size=3]类调用实例方法[/size]
  4. 类不能直接调用实例方法,由于实例方法须要一个实例对象来访问其属性和方法。假如你实行从类本身调用实例方法,你会得到一个TypeError,由于Python不知道应该将哪个实例对象作为self参数通报。
  5. [code]
复制代码
python复制代码
class MyClass:
def instance_method(self):
print("This is an instance method")
# 实行从类调用实例方法(错误)
MyClass.instance_method() # TypeError: instance_method() missing 1 required positional argument: 'self'
在这个例子中,MyClass.instance_method()调用会导致TypeError,由于instance_method须要一个实例对象作为self参数。
小总结


  • 实例可以调用类方法,由于类方法不须要实例对象作为参数。
  • 类不能直接调用实例方法,由于实例方法须要一个实例对象作为参数。
假如你须要在类中既有类方法又有实例方法,而且盼望它们可以或许相互访问,你通常会在类方法中通过创建实例或利用其他类方法来间接地调用实例方法,大概在实例方法中通过self来访问类变量或调用其他实例方法。
在Python中,self 不是类本身,而是类的实例对象本身。当你界说一个实例方法时,Python 会自动将调用该方法的实例对象作为第一个参数通报给这个方法,按照惯例,这个参数被定名为 self。
这里有一个简朴的例子来阐明 self 的用途:
[code][/code]python复制代码
class MyClass:
def __init__(self, value):
self.value = value # 这里 self.value 指的是实例对象的 value 属性
def display_value(self):
print(self.value) # 这里 self 指的是调用 display_value 方法的实例对象
# 创建 MyClass 的一个实例
my_instance = MyClass(10)
# 调用实例方法
my_instance.display_value() # 输出: 10
在这个例子中:

  • MyClass 是一个类。
  • __init__ 是一个特别的方法(构造函数),用于初始化新创建的实例对象。
  • self.value 在 __init__ 方法中设置,它指的是调用该方法的实例对象的 value 属性。
  • display_value 是一个实例方法,它利用 self 参数来访问调用该方法的实例对象的 value 属性。
当你调用 my_instance.display_value() 时,Python 会自动将 my_instance 作为 self 参数通报给 display_value 方法。因此,在 display_value 方法内部,self 指的是 my_instance。
总结一下,self 是指向实例对象本身的引用,而不是类本身。类本身在Python中通常通过类名来引用,而在类方法中利用 cls 作为指向类本身的引用(通过 @classmethod 装饰器界说)。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表