python的常用魔术方法、类方法、静态方法

1.当定义一个类时,在内存中会开辟出一块空间。

当用类创建一个对象时,同样也会在内存中开辟出一块空间:分为三步:

(1)先找内存中有没有一块空间是某类的

(2)通过系统的object.__new__方法,向内存申请一块与该类一样的空间,并将该地址传给__init__中的self

(3)再去该类的空间中找有没有__init__,如果没有则执行将开辟出的空间给对象名;

如果有__init__,则会进入init方法执行里面的内容,然后将开辟出的空间给对象名。

__init__中的属性会动态的被添加到该类的对象所在空间中。

2.当用实例化对象调用类中的对象方法时,会先去该对象的空间中找有无方法中的属性,如果没有再去类的空间中找。

3.__init__:初始化魔术方法

__new__:实例化魔术方法

__call__:将对象当作函数调用时触发,对象()

__del__:通过“del 对象名 ”删除地址的引用,当一块空间没有任何引用时,会调用__del__垃圾回收;

当程序执行到末尾时,就会触发python底层自带的垃圾回收机制(内存释放)。

查看对地址的引用次数:import sys   sys.getrefcount(对象)

__str__:打印对象名,自动触发去调用__str__里面的内容,注意在__str__()方法中一定要加return 返回值。

__slots__:不使⽤字典,⽽是只给⼀个固定集合的属性分配空间。

4.类方法,是在类中定义一个方法依赖于装饰器@classmethod.

类方法中参数不是一个对象,而是类。

在类方法中只能使用类属性。

类方法中不能使用普通方法(即对象方法),只能使用类属性和类方法。

5.静态方法,是在类中定义一个方法依赖于装饰器@staticmethod,且无需传递参数(cls,self)。

静态方法只能访问类的属性和方法,无法访问对象的方法和属性。

加载时同类方法,需用类名调用。

<think>嗯,用户问的是Python方法的分类。我需要先回顾一下Python方法的不同类型,确保自己理解正确,然后组织一个清晰的回答结构。 首先,Python中的方法主要可以分为实例方法类方法静态方法。这三种方法使用不同的装饰器,并且它们的参数和调用方式也不同。可能需要分别解释每种方法的定义、特点和使用场景。 实例方法是最常见的,第一个参数是self,指向实例本身。它们可以访问和修改实例的属性,也可以调用其他实例方法。需要说明调用方式,比如通常通过实例来调用,但也可以通过类来调用,这候需要显式传递实例参数。 然后是类方法,使用@classmethod装饰器,第一个参数是cls,指向类本身。类方法可以访问类的属性,修改类状态,适用于工厂模式或者操作类级别的数据。调用可以通过类或者实例,但参数cls会自动传入类本身。 接下来是静态方法,使用@staticmethod装饰器,没有默认的self或cls参数。它们就像普通函数,但逻辑上属于类。静态方法不能修改类或实例的状态,适合工具函数。调用同样可以通过类或实例,但不需要传递额外的参数。 另外,可能还有一些特殊方法,比如魔术方法(以双下划线开头和结尾的方法),如__init__、__str__等,它们在特定情况下被调用。这些方法常用于操作符重载或类的构造、字符串表示等。 需要确保在回答中提到每种方法的定义、装饰器、参数、访问权限以及典型用途。可能还需要举一些简单的代码示例来帮助说明,比如实例方法修改实例属性,类方法创建实例,静态方法执行独立任务等。 还要注意用户可能对何使用哪种方法感到困惑,比如类方法静态方法的区别。需要强调类方法用于需要访问类状态的情况,而静态方法则独立于类和实例。 另外,可能用户对装饰器的理解不够,需要简单解释@classmethod和@staticmethod的作用,但不用深入装饰器的原理,保持回答的简洁性。 最后,总结一下各种方法的区别和适用场景,帮助用户更好地选择合适的方法类型。确保语言通俗易懂,结构清晰,分点说明,便于用户理解。</think>在 Python 中,方法根据其作用域和调用方式可分为以下几类,它们的核心区别在于参数和访问权限: --- ### 1. **实例方法 (Instance Method)** - **定义**:默认类型,第一个参数为 `self`(指向实例自身) - **特点**: - 可访问和修改实例属性 - 可调用其他实例方法类方法 - **调用方式**:通过实例调用 - **示例**: ```python class MyClass: def instance_method(self, x): self.x = x # 操作实例属性 return self.x obj = MyClass() obj.instance_method(10) # 输出 10 ``` --- ### 2. **类方法 (Class Method)** - **定义**:使用 `@classmethod` 装饰器,第一个参数为 `cls`(指向类自身) - **特点**: - 可访问和修改类属性 - 常用于工厂模式(创建实例的替代方式) - **调用方式**:通过类或实例调用 - **示例**: ```python class MyClass: class_attr = 0 @classmethod def class_method(cls): cls.class_attr += 1 # 操作类属性 return cls.class_attr MyClass.class_method() # 输出 1 ``` --- ### 3. **静态方法 (Static Method)** - **定义**:使用 `@staticmethod` 装饰器,无默认参数(无需 `self` 或 `cls`) - **特点**: - 不能直接访问类或实例属性 - 类似普通函数,但逻辑上属于类 - 适合工具函数或独立操作 - **调用方式**:通过类或实例调用 - **示例**: ```python class MyClass: @staticmethod def static_method(a, b): return a + b # 无依赖类或实例的逻辑 MyClass.static_method(3, 5) # 输出 8 ``` --- ### 4. **特殊方法 (Magic/Dunder Method)** - **定义**:以双下划线 `__` 开头和结尾(如 `__init__`, `__str__`) - **特点**: - 由 Python 解释器自动调用(如对象初始化、运算符重载) - 可自定义类的行为(如迭代、字符串表示) - **示例**: ```python class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): # 重载 + 运算符 return Vector(self.x + other.x, self.y + other.y) ``` --- ### **对比总结** | 方法类型 | 装饰器 | 参数 | 访问权限 | 典型用途 | |----------------|-----------------|---------|------------------------|------------------------| | **实例方法** | 无 | `self` | 实例属性、类属性 | 操作实例数据 | | **类方法** | `@classmethod` | `cls` | 类属性 | 工厂模式、类级操作 | | **静态方法** | `@staticmethod` | 无 | 无 | 工具函数 | | **特殊方法** | 无 | 自定义 | 按需定义 | 自定义类行为 | --- ### **选择建议** - 需要操作实例数据 → **实例方法** - 需要操作类级别的数据 → **类方法** - 逻辑独立于类和实例 → **静态方法** - 需要自定义类行为 → **特殊方法**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值