绑定方法与非绑定方法

类中定义的函数分为两大类

  • 绑定方法
    绑定给谁,就由谁来调用,并将自身作为第一个参数传入

    1. 绑定到对象的方法 - 没有被任何装饰器装饰的方法
      为对象量身定制
      对象.bund_method(),自动将对象当作第一个参数传入
      属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值一说

    2. 绑定到类的方法 - 用classmethod装饰器装饰的方法
      为类量身定制
      类.bund_method(),自动将类作为第一个参数传入
      其实对象也可以调用,但仍将类作为第一个参数传入

  • 非绑定方法 - 用staticmethod装饰器装饰的方法
    不与类或对象绑定,类和对象都可以调用,但是没有自动传值一说,就是一个普通函数工具。
    注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说。

绑定方法

  • 绑定到对象的方法 【略】

  • 绑定到类的方法 - classmethod
    classmethod是给类用的,即绑定到类,类在使用时会将类本身当作参数传给类方法的第一个参数(即便是对象来调用也会将类当做第一个参数传入),python为我们内置了函数classmethod装饰器来把类中的函数定义成类方法。

HOST = '127.0.0.1'
PORT = 3306
DB_PATH = r'/Users/hhjie/Documents/git-hehongjie/Python-Luffycity/面向对象/知识点/db'
# -*- coding: utf-8 -*-
# @Author  : hhjie
# @Time    : 2018-05-29 23:15
# @File    : 绑定到类的方法.py


import os
import sys

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(BASE_DIR)

from conf 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)
conn = MySQL.from_conf()
print(conn.__dict__)

非绑定方法

在类内部用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> #查看结果为普通函数
posted @ 2018-05-30 00:02  hehongjie  Views(94)  Comments(0Edit  收藏  举报