• 方法与函数的区别


    方法的本质就是函数,只是由于调用者的不同导致传参不同
    方法又可区分为绑定方法和非绑定绑定方法
    类中没有添加任何装饰器的方法是绑定给对象的方法,
    加了classmethod装饰器的方法称为类得到绑定方法,
    加了staticmethod装饰器的方法称为非绑定方法

    class Foo:
        """这是Foo的doc"""
        def __init__(self, name):
            self.name = name
    
        def func1(self):
            print("普通方法",self)
        @staticmethod
        def func2():
            print("非绑定方法")
        @classmethod
        def func3(cls):
            print("绑定给类的方法",cls)
    
    a = Foo("summer")
    print(a) #<__main__.Foo object at 0x102462c88>  a是foo的一个对象
    print(Foo) #<class '__main__.Foo'>
    print(a.func1) #<bound method Foo.func1 of <__main__.Foo object at 0x102462c88>>
    print(Foo.func1) #<function Foo.func1 at 0x102481b70>
    print(a.func2) #<function Foo.func2 at 0x102497048>
    print(Foo.func2) #<function Foo.func2 at 0x102497048>
    print(a.func3) #<bound method Foo.func3 of <class '__main__.Foo'>>
    print(Foo.func3) #<bound method Foo.func3 of <class '__main__.Foo'>>
    

    当由类产生的对象在调用类中的方法的时候,该函数就称为方法,但是由类自己来调用普通的方法的时候,这个方法就是函数,并且内存地址不相同
    特殊的是,在函数的上一行添加了一个@staticmethod的装饰器后,它就是一个普通的函数,不用自动传参,不管是由对象还是类来调用,都是调用同一个内存地址
    在方法的上一行加上@classmethod装饰器后,对象和类来调用都是方法。

    class Foo:
        """这是Foo的doc"""
        def __init__(self, name):
            self.name = name
    
        def func1(self):
            print("普通方法",self)
        @staticmethod
        def func2():
            print("非绑定方法")
        @classmethod
        def func3(cls):
            print("绑定给类的方法",cls)
    
    a = Foo("summer")
    a.func1()
    Foo.func1(a)
    a.func2()
    Foo.func2()
    a.func3()
    Foo.func3()
    普通方法 <__main__.Foo object at 0x101b62cc0>
    普通方法 <__main__.Foo object at 0x101b62cc0>
    非绑定方法
    非绑定方法
    绑定给类的方法 <class '__main__.Foo'>
    绑定给类的方法 <class '__main__.Foo'>
    

    当对象调用类中的普通方法的时候,不用参数,会将对象本身作为参数传入到self中,但是由类来调用的时候需要传入一个参数

    当对象以及类来调用类的绑定方法的时候都不用传入参数

  • 相关阅读:
    OpenID Connect 验证
    升级到 .NET Core 3.1
    深入 .NET Core 基础
    依赖注入在 dotnet core 中实现与使用:3 使用 Lazy<T> 延迟实例化
    依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection
    依赖注入在 dotnet core 中实现与使用:1 基本概念
    ng-bootstrap 组件集中 tabset 组件的实现分析
    一笔百亿美元军方订单,引发了美国科技公司大混战
    4种事务的隔离级别,InnoDB怎样巧妙实现?
    Google I/O 官方应用中的动效设计
  • 原文地址:https://www.cnblogs.com/xiayuhao/p/9573068.html
Copyright © 2020-2023  润新知