zoukankan      html  css  js  c++  java
  • classmethode,staticmethode

    一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法

    而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用

    classmethodstaticmethod都是python解释器内置的装饰器

    类中定义的函数分为两大类:绑定方法和非绑定方法

    在类中正常定义的函数默认是绑定到对象的,而为某个函数加上装饰器@classmethod后,该函数就绑定到了类。


    classmethod:

    是一个装饰器,给类内部定义方法的装饰,将类内部的方法变为 “类的绑定方法”。

    classmethod 修饰符对应的函数不需要实例化,不需要 self 参数

    但第一个参数参数 需要是表示自身类的 cls 参数,该参数名一般约定为“cls”,通过它来传递类的属性和方法

    调用: 可以用类名直接调用

    绑定到类的方法就是专门给类用的,但其实对象也可以调用,只不过自动传入的第一个参数仍然是类,也就是说这种调用是没有意义的,并且容易引起混淆

    示例
     
    class A(object):
        bar = 1
        def func1(self):  
            print ('foo') 
        @classmethod
        def func2(cls):
            print ('func2')
            print (cls.bar)
            cls().func1()   # 调用 foo 方法
    
    A.func2() # 不需要实例化
    输出结果
     
    输出结果:
    func2 
    1
    foo
    

    staticmethod:

    静态方法 是一个装饰器,给在类内部定义方法中装饰,将类内部的方法变为 “非绑定方法”。

    静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定,也正是因为如此,此方法中无法调用任何类和对象的属性和方法,静态方法其实和类的关系不大;就像正常调用函数一样

    实例对象和类对象都可以调用。

    在使用 Python 编程时,一般不需要使用类方法或静态方法,程序完全可以使用函数来代替类方法或静态方法

    import uuid
    class MySQL:
        def __init__(self,host,port):
            self.id=self.create_id()
            self.host=host
            self.port=port
        @staticmethod
        def create_id():
            return uuid.uuid1()
    
    >>> conn=MySQL(‘127.0.0.1',3306)
    >>> print(conn.id) #100365f6-8ae0-11e7-a51e-0088653ea1ec
    
    # 类或对象来调用create_id发现都是普通函数,而非绑定到谁的方法
    >>> MySQL.create_id
    <function MySQL.create_id at 0x1025c16a8>
    >>> conn.create_id
    <function MySQL.create_id at 0x1025c16a8>
    


    总结:

    • 对象的绑定方法:

      • 由对象来调用,由谁来调用,会将谁(对象)当做第一个参数传入。
    • 类的绑定方法:

      • 由类来调用,由谁来调用,会将谁(类)当做第一个参数传入。
    • 非绑定方法:

      • 可以由对象或类来调用,谁来调用都是一个普通方法(普通函数),方法需要传入几个参数,就得传入几个。

    总结绑定方法与非绑定方法的使用:若类中需要一个功能,该功能的实现代码中需要引用对象则将其定义成对象方法、需要引用类则将其定义成类方法、无需引用类或对象则将其定义成静态方法。


    classmethode示例

    classmethod_Demo:
    class DB:
        __data = 'tank is very handsome!!!'
    
        def __init__(self, user, pwd, role):
            self.user = user
            self.pwd = pwd
            self.role = role
    
        # @classmethod
        # def init(cls, user, pwd, role):  # cls --》指的是类
        #     # 在类方法内部调用类产生一个实例 ---》 对象
        #     return cls(user, pwd, role)
    
        # 查看数据方法
        @classmethod
        def check_db(cls, user, pwd, role):  # cls --》指的是类
    
            # 在类方法内部调用类产生一个实例 ---》 对象
            obj = cls(user, pwd, role)
    
            # 1.查看数据前,必须要通过校验
            if obj.user == 'tank' and obj.pwd == '123' and obj.role == 'admin':
                print('检验通过..')
                print(cls.__data)
                return cls.__data
    
    
    DB.check_db('tank', '123', 'admin')
    
    # db_obj = DB('tank', '123', 'admin')
    # db_obj.check_db()
    # __class__: 查看当前对象的类
    # print(db_obj.__class__)
    

    staticmethode示例

    class Foo:
        @staticmethod
        def func(res):
            print(res)
    
    obj = Foo()
    
    # 对象调用非绑定方法
    obj.func(123)
    
    # 类调用非绑定方法
    Foo.func(1234)
    
    
  • 相关阅读:
    CentOS7安装注意
    ES插件安装
    CentOS7命令
    ES安装手册
    五 、redis-cluster java api
    四 、Redis 集群的搭建
    三 redis 的 java api(jedis)
    C#验证码 使用GDI绘制验证码
    云时代架构阅读笔记二——Java性能优化(二)
    【转载】Asp .Net Web Api路由路径问题
  • 原文地址:https://www.cnblogs.com/kai-/p/11951851.html
Copyright © 2011-2022 走看看