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

而使用@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)

 posted on 2019-11-28 18:06  Rannie`  阅读(210)  评论(0编辑  收藏  举报
去除动画
找回动画