本文翻译自我的英文博客,最新修订内容可随时参考:Python中的实例方法、类方法、静态方法与魔法方法
在Python中,方法的类型决定了其与类、实例的交互方式。本文将详细解析实例方法(Instance Method)、类方法(Class Method)、静态方法(Static Method)的区别,并介绍特殊的魔法方法(Magic Method和私有方法。
定义:最常见的方法,默认以 self
为第一个参数,self
指向类的实例。
调用方式:只能通过类的实例调用。
特点:
self.attribute
)和类属性(通过 self.__class__.attribute
)。 示例:
class MyClass:
def instance_method(self):
print(f"Instance method called on {self}")
obj = MyClass()
obj.instance_method() # 输出: "Instance method called on <MyClass object at 0x...>"
定义:使用 @classmethod
装饰器声明,第一个参数为 cls
(指向类本身)。
调用方式:可通过类名直接调用,也可通过实例调用(推荐用类名)。
特点:
cls.attribute
),无法访问实例属性。 示例:
class MyClass:
class_var = "I'm a class variable"
@classmethod
def class_method(cls):
print(f"Class method called on {cls}, class_var: {cls.class_var}")
MyClass.class_method() # 输出: "Class method called on <class 'MyClass'>, class_var: I'm a class variable"
定义:使用 @staticmethod
装饰器声明,无默认参数(既不接收 self
也不接收 cls
)。
调用方式:通过类名或实例名调用,推荐用类名。
特点:
示例:
class MyClass:
@staticmethod
def static_method(x, y):
return x + y
print(MyClass.static_method(2, 3)) # 输出: 5
类型 | 装饰器 | 第一个参数 | 访问实例属性 | 访问类属性 | 调用方式 | 典型用途 |
---|---|---|---|---|---|---|
实例方法 | 无 |
| ✅ | ✅(通过self) | 实例.方法() | 操作实例状态(如对象初始化) |
类方法 |
|
| ❌ | ✅ | 类.方法() | 操作类状态(如工厂方法) |
静态方法 |
| 无 | ❌ | ❌ | 类.方法() | 与类相关的工具函数 |
定义:名称以双下划线开头和结尾的特殊方法(如 __init__
、__str__
),由Python解释器自动调用,用于实现类的特殊行为。
特点:
__init__(self, ...)
:实例初始化方法,在 __new__
之后调用,用于设置实例属性。 __new__(cls, ...)
:创建实例的第一个方法,返回实例对象,用于控制实例创建过程(如单例模式)。 __del__(self)
:析构方法,实例被销毁时调用(不保证在程序结束时执行)。 __str__(self)
:返回对象的字符串表示(print(obj)
时调用)。 __repr__(self)
:返回对象的官方字符串表示(repr(obj)
时调用)。 __add__(self, other)
:定义 +
运算符行为(如自定义类的加法逻辑)。 __len__(self)
:定义 len(obj)
的返回值。 示例:自定义字符串表示
class MyClass:
def __init__(self, name):
self.name = name
def __str__(self):
return f"MyClass instance with name: {self.name}"
obj = MyClass("Alice")
print(obj) # 输出: "MyClass instance with name: Alice"(自动调用__str__)
定义:方法名以双下划线开头(如 __private_method
),用于隐藏方法细节。
特点:
AttributeError
。 _ClassName__private_method
,仍可通过 实例._ClassName__private_method()
访问(不推荐)。 示例:
class MyClass:
def __private_method(self):
print("This is a private method")
def public_method(self):
self.__private_method() # 内部调用私有方法
obj = MyClass()
# obj.__private_method() # 报错: AttributeError
obj._MyClass__private_method() # 强制访问(不建议)
__getitem__
、__len__
等方法。 __setstate__
、__getstate__
。 如需深入学习魔法方法,可参考官方文档:Python Magic Methods。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。