zoukankan      html  css  js  c++  java
  • 面向对象(四)--绑定方法与非绑定方法(classmethod、staticmethod装饰器)

    一、绑定方法与非绑定方法

    1、绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

    (1)绑定给对象的方法:在类内部定义的函数(没有被任何装饰器修饰的)默认就是绑定给对象用的。

    (2)绑定给类的方法:在类内部定义的函数如果被装饰器@classmethod修饰,则是绑定给类的,应该由类来调用,

    调用时将类作为第一个参数自动传入。

      绑定方法的精髓在于=========自动传值。

    class Foo:
        def f1(self):     # 绑定给对象的方法
            print('对象')
    
        @classmethod    # 绑定给类的方法
        def f2(cls):
            print('绑定给类')
    
    obj=Foo()
    
    # 绑定给对象的方法,自动传入对象
    obj.f1()
    
    # 绑定给类的方法,自动传值类
    Foo.f2()

    2、非绑定方法:类中定义的函数如果被@staticmethod装饰,那么该函数就变成非绑定方式,既不与类绑定,也不与对象绑定,意味着类与对象都可以调用,但只是作为一个普通函数,不会有自动传值的效果。

    import settings
    
    class MySql:
        def __init__(self,ip,port):
            self.ip=ip
            self.port=port
            self.id=id
    
        def tell_info(self):
            print('**id:%s ip:%s port:%s**' %(self.id,self.ip,self.port))
    
        @classmethod
        def from_conf(cls ):
            return cls(settings.IP,settings.PORT)
    
        @staticmethod
        def creat_id():
            import uuid
            return uuid.uuid4()
    
    # obj1=MySql('127.0.0.1',3306)
    # obj1.tell_info()
    # obj2=MySql(settings.IP,settings.PORT)
    obj2=MySql.from_conf()
    obj2.tell_info()

    3、注意点

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

  • 相关阅读:
    一起来构建前端工具链吧~(新建项目)
    我的前端故事----高仿支付宝密码输入框
    我的前端故事----疯狂倒计时(requestAnimationFrame)
    Oracle 导入导出SQL 查看登录用户表个数
    Oracle11g使用exp导出空表
    Spring Boot(二)Application events and listeners
    Spring Boot(一)启动方式
    Android BroadcastReceiver
    钱格式化
    Intellij idea 快键键
  • 原文地址:https://www.cnblogs.com/zhangbingsheng/p/10415015.html
Copyright © 2011-2022 走看看