绑定方法与非绑定方法介绍

前言

【 一 】绑定方法

  • 绑定给谁,谁来调用就自动将它本身当作第一个参数传入

(1)绑定到类的方法

  • 用classmethod装饰器装饰的方法。

  • 为类量身定制

  • 类.boud_method(),自动将类当作第一个参数传入

  • (其实对象也可调用,但仍将类当作第一个参数传入)

(2)绑定到对象的方法

  • 没有被任何装饰器装饰的方法

  • 为对象量身定制

  • 对象.boud_method(),自动将对象当作第一个参数传入

  • (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

【 二 】非绑定方法

  • 用staticmethod装饰器装饰的方法

  • 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。

  • 就是一个普通工具而已

【  三 】小结

  • 与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值
  • 而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

【 四 】实例方法

【 1 】绑定给对象的方法

        绑定给对象的方法指的是在类中定义的方法,它们可以通过类的实例对象来调用。在 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() # 这也是一种方法!

【 2 】绑定给类的方法(classmethod)

        绑定给类的方法是一种类型的方法,在方法定义上使用了 @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

        需要注意的是,绑定给类的方法可以访问和修改类的属性,因为它们与类本身相关联,而不是特定的实例对象。

【 3 】非绑定方法

        非绑定方法也称为实例方法,它们与绑定方法不同之处在于,非绑定方法没有约定的第一个参数。相反,它们的第一个参数通常被命名为 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作为第一个参数来引用类本身。

总结起来,绑定方法和非绑定方法是与类和实例对象的关联性相关的概念,而静态方法和动态方法是与方法本身的调用方式和特性相关的概念。

具体示例:

你可能感兴趣的:(python,开发语言)