zoukankan      html  css  js  c++  java
  • 方法与函数的区别

    方法的本质就是函数,只是由于调用者的不同导致传参不同
    方法又可区分为绑定方法和非绑定绑定方法
    类中没有添加任何装饰器的方法是绑定给对象的方法,
    加了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中,但是由类来调用的时候需要传入一个参数

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

  • 相关阅读:
    LeetCode278. 第一个错误的版本
    LeetCode275. H 指数 II
    LeetCode274. H 指数
    LeetCode273. 整数转换英文表示
    LeetCode268. 缺失数字
    LeetCode264. 丑数 II
    LeetCode263. 丑数
    关于解决Chrome新版本中cookie跨域携带和samesite的问题处理
    java将list转为树形结构的方法
    Python pycharm selenium hyrobot 学习中遇到的问题汇总2
  • 原文地址:https://www.cnblogs.com/xiayuhao/p/9573068.html
Copyright © 2011-2022 走看看