用classmethod装饰器装饰的方法。
为类量身定制
类.boud_method()
,自动将类当作第一个参数传入
(其实对象也可调用,但仍将类当作第一个参数传入)
没有被任何装饰器装饰的方法
为对象量身定制
对象.boud_method()
,自动将对象当作第一个参数传入
(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
用staticmethod装饰器装饰的方法
不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。
就是一个普通工具而已
绑定给对象的方法指的是在类中定义的方法,它们可以通过类的实例对象来调用。在 Python 中,当我们通过实例对象来调用一个方法时,该方法会自动将实例对象作为第一个参数传递给方法,通常习惯将这个参数命名为 self
。
class MyClass:
def target(self):
print('这个是一种方法!')
# 创建实例对象
x = MyClass()
# 调用绑定给对象的方法
x.target()
# 这个是一种方法!
需要注意的是,绑定给对象的方法会自动将实例对象作为第一个参数传递给方法,因此在方法定义中需要显式地声明一个参数(通常命名为
self
)来接收实例对象。在调用方法时,无需显式地传递实例对象,Python 会自动将实例对象传递给方法
另外,绑定给对象的方法也可以访问实例对象的属性。例如,在方法中可以使用 self.attribute_name
的方式来访问实例对象的属性。
class MyClass:
def __init__(self,value):
self.attribute = value
def print_attribute(self):
print(self.attribute)
# 创建实例对象
x = MyClass('这也是一种方法!')
# 调用绑定给对象的方法, 访问实例对象的属性
x.print_attribute() # 这也是一种方法!
绑定给类的方法是一种类型的方法,在方法定义上使用了 @classmethod 装饰器。与绑定给对象的的方法不同, 绑定给类的方法可以通过类本身调用,而不需要创建的实例对象。
绑定给类的方法的定义方式如下:
class MyClass:
@classmethod
def my_class(cls, x, y):
#方法逻辑
print(f'x:{x},y:{y}')
# 调用绑定给类的方法
MyClass.my_class('ni','hao')
# x:ni,y:hao
绑定给类的方法的第一个参数通常被命名为
cls
,它代表类本身,而不是类的实例对象。通过这个参数,我们可以在方法中访问类的属性、调用类的其他方法等。
需要注意的是,绑定给类的方法可以通过类本身直接调用,而不需要创建类的实例对象。在调用时,需要使用类名和方法名的组合来调用这个方法。
演示了绑定给类的方法的用法:
class MyClass:
count = 0
@classmethod
def increase_count(cls):
cls.count += 1
@classmethod
def get_count(cls):
return cls.count
# 调用绑定给类的方法
MyClass.increase_count()
MyClass.increase_count()
MyClass.increase_count()
MyClass.increase_count()
# 调用绑定给类的方法, 访问的属性
print(MyClass.get_count())
# 4
需要注意的是,绑定给类的方法可以访问和修改类的属性,因为它们与类本身相关联,而不是特定的实例对象。
非绑定方法也称为实例方法,它们与绑定方法不同之处在于,非绑定方法没有约定的第一个参数。相反,它们的第一个参数通常被命名为 self
,代表类的实例本身。
非绑定方法不是通过 staticmethod
装饰器定义的普通函数,而是在类内定义的实例方法。它们仍然需要将实例对象作为第一个参数传递(通常命名为 self
),但不同于绑定方法,它们不会自动接收该参数。
staticmethod
装饰器用于将类中定义的方法转换为静态方法。静态方法不与类或实例对象绑定,因此可以被任何对象直接调用,不会自动传递类实例或类本身作为参数。
非绑定方法、实例方法和静态方法之间的区别:
class MyClass:
class_var = 0
def instance_fa(self):
# 实例方法, 需要通过实例对象调用
print('这个一个实例方法!')
@staticmethod
def static_fa():
# 静态方法,可以直接通过类或类实例对象调用
print('这是一种静态方法!')
@classmethod
def class_fa(cls):
# 绑定给类的方法, 可以通过类或实例对象调用, 自动传递或实例对象作为参数
print('这是一个绑定到类的方法!')
# 创建实例对象
x = MyClass()
# 调用实例方法
x.instance_fa()
# 这个一个实例方法!
# 调用静态方法
MyClass.static_fa() # 第一种
x.static_fa() # 第二种
# 这是一种静态方法!
# 这是一种静态方法!
# 调用绑定给类的方法
MyClass.class_fa() # 第一种
x.class_fa() # 第二种
# 这是一个绑定到类的方法!
# 这是一个绑定到类的方法!
可以看到,非绑定方法需要通过实例对象调用,而静态方法可以直接通过类或实例对象调用。同时,绑定给类的方法可以通过类或实例对象调用,并自动传递类或实例对象作为参数。
绑定方法和非绑定方法并不等同于静态方法和动态方法。绑定方法和非绑定方法是与类和实例对象的关联性相关的概念,而静态方法和动态方法是与方法本身的调用方式和特性相关的概念。
绑定方法:绑定方法是与类的实例对象关联的方法。在Python中,通常情况下,我们在类中定义的方法都是绑定方法。绑定方法会自动将实例对象作为第一个参数(通常命名为self
)传递给方法。通过实例对象调用绑定方法时,实例对象会被自动传递给该方法,并绑定到第一个参数上,以便我们可以访问实例对象的属性和方法。
非绑定方法:非绑定方法是既不与类本身关联,也不与类的实例对象关联的方法。这些方法具有完全独立的命名空间,只能通过实例对象来调用,并且在调用时不会自动传递任何额外的参数。
静态方法:静态方法是在类中定义的方法,与类和实例对象没有直接的关联。静态方法不会自动传递类或实例对象作为参数,因此在静态方法内部无法访问类变量和实例变量。我们可以通过使用@staticmethod
装饰器来声明静态方法。
动态方法:动态方法是在类中定义的方法,与类的实例对象关联。动态方法会自动将实例对象作为第一个参数传递给方法,以便我们可以访问实例对象的属性和方法。我们可以通过使用@classmethod
装饰器来声明动态方法,并使用cls
作为第一个参数来引用类本身。
总结起来,绑定方法和非绑定方法是与类和实例对象的关联性相关的概念,而静态方法和动态方法是与方法本身的调用方式和特性相关的概念。
具体示例: