Python面向对象-绑定方法和非绑定方法

一.在类内部定义的函数

在类内部定义的函数,分为两大类:

二.绑定方法

    绑定方法:绑定给谁,就由谁来调用,谁来调用,谁就是self/cls

        绑定到对象的方法:在类内定义的,没有被任何装饰器修饰的函数属性,都是绑定给对象的方法

            对象.bound_method(),自动将对象当做第一个参数传入

            (类也可以调用,但必须按函数的调取规则来,即self需要手动传参)

        绑定到类的方法:在类内定义的,用classmethod装饰器修饰的函数属性

            类.bound_method(),自动将类当做第一个参数传入

            (对象也可以调用,但仍将类作为第一个参数传入)

  绑定给类的方法:实例如下

HOST='127.0.0.1'
PORT=3306
settings
#classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法
    import settings
    class MySQL:
            def __init__(self,host,port):
                    self.host=host
                    self.port=port
            @classmethod
            def from_conf(cls):
                    print(cls)
                    return cls(settings.HOST,settings.PORT)
    print(MySQL.from_conf) #<bound method MySQL.from_conf of <class '__main__.MySQL'>>
    conn=MySQL.from_conf()
    conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类

三.非绑定方法

    2、非绑定方法

        不与类或者对象绑定,用staticmethod装饰器修饰的函数属性,类或者对象都可以调用,也就是普通函数,普通函数

    就没有自动传值这一说了,该怎么传就怎么传

 

#在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数,statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果
    import hashlib
    import time
    class MySQL:
            def __init__(self,host,port):
                    self.id=self.create_id()
                    self.host=host
                    self.port=port
            @staticmethod
            def create_id(): #就是一个普通工具
                    m=hashlib.md5(str(time.time()).encode('utf-8'))
                    return m.hexdigest()
    print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数
    conn=MySQL('127.0.0.1',3306)
    print(conn.create_id) #<function MySQL.create_id at 0x00000000026FB9D8> #查看结果为普通函数

四.classmethod与staticmethod的区别

虽然classmethodstaticmethod非常相似,但两种实体的用法略有不同:classmethod必须将对类对象的引用作为第一个参数,而staticmethod根本没有参数。

class Date(object):

    def __init__(self, day=0, month=0, year=0):
        self.day = day
        self.month = month
        self.year = year

    @classmethod
    def from_string(cls, date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        date1 = cls(day, month, year)
        return date1

    @staticmethod
    def is_date_valid(date_as_string):
        day, month, year = map(int, date_as_string.split('-'))
        return day <= 31 and month <= 12 and year <= 3999

date2 = Date.from_string('11-09-2015')
is_date = Date.is_date_valid('11-09-2015')
实例

classmethod是用类作为第一个参数传入来进行使用,

staticmethod,我们没有任何访问类的东西 - 它基本上只是一个函数,在语法上称为方法,但不能访问对象,它的内部(字段和其他方法) 

 

参考:https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner/12179325#12179325

posted @ 2018-03-05 16:53  明-少  阅读(103)  评论(0)    收藏  举报