• 绑定方法和非绑定方法


    一:绑定方法

    绑定方法有两种,一种是与对象绑定,在类中定义的方法都是都是默认与对象绑定的,另一种是绑定到类的方法,要加上classmethod装饰器:

    class People:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def get_name(self):
            print("我的名字是:{}".format(self.name))
    
        @classmethod
        def say_hello(cls):
            print('hello!!', cls.__name__)
    
        @staticmethod
        def info(self, a, b):
            print(self.name, a, b)
    演示案例

    绑定到对象的方法:

    定义:类中定义的方法都默认绑定对象

    def get_name(self):
        print("我的名字是:{}".format(self.name))

    对象来调用

    p1 = People('ls', 19) #实例化出一个对象
    p1.get_name() #调用绑定到对象的方法
    
    #运行结果:我的名字是:ls

    类来调用

    p1 = People('ls', 19)
    Pepel.get_name(p1) #需要传入一个参数
    
    #运行结果:我的名字是:ls

    其它的类和其实例化对象来调用,都不能调用。这是因为类中定义的方法,其方法名称存在于类的名称空间之中。

    绑定到类的方法:

    绑定到类的方法的定义:是类中用classmethod装饰的方法

    @classmethod
    def say_hello(cls):
        print('hello!!', cls.__name__)

    对象来调用:

    p1 = People('ls', 19)
    p1.say_hello()  #对象调用绑定到类的方法
    
    #运行结果:hello!! People

    对象调用,会自动把对象的类作为第一个参数自动传入

    类来调用:

    People.say_hello()
    
    #运行结果:hello!! People

    类调用绑定到类的方法,有自动传值的特性,会把类本身作为第一个参数自动传入

    二:非绑定方法

    非绑定方法是类中用staticmethod装饰的方法,被staticmethod装饰的方法不与任何对象和类绑定。

    定义非绑定方法:

    @staticmethod
        def info(self, a, b):
            print(self.name, a, b)

    对象调用:

    p1 = People('ls', 19)
    p1.info(p1, 1, 2)
    
    #运行结果:ls 1 2

    没有指定自动传值的特性,按照一般函数的参数传入要求传值。

    类来调用:

    People.info(p1, 2, 3)
    
    #运行结果:ls 2 3

    同对象调用要求一致

    三:总结

    无论是绑定到对象的方法,还是绑定到类的方法,亦或是静态方法,类和类的对象都可以调用,其中:

    绑定到对象的方法:

            对象调用有自动传值特性,会把对象本身当做第一个值自动传入;

            类来调用,失去自动传值的特性,必须要传入一个满足条件的实参。

    绑定到类的方法:

            类调用有自动传值特性,会把类本身当做第一个值自动传入;

            对象调用会自动把对象的类当做第一个值自动传入。

    非绑定方法:

      不与任何绑定,类和类的实例化对象都可以调用,没有自动传值的特性,调用静态方法,就像调用普通函数一样必须传入与形参一一对应的实参。

  • 相关阅读:
    Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor
    Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
    IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
    Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
    Java Spring Boot VS .NetCore (七) 配置文件
    Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
    Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
    Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
    Java Spring Boot VS .NetCore (三)Ioc容器处理
    Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
  • 原文地址:https://www.cnblogs.com/li1992/p/9152680.html
Copyright © 2020-2023  润新知