绑定方法与非绑定方法
类中定义的函数分为两大类
-
绑定方法
绑定给谁,就由谁来调用,并将自身作为第一个参数传入-
绑定到对象的方法 - 没有被任何装饰器装饰的方法
为对象量身定制
对象.bund_method(),自动将对象当作第一个参数传入
属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值一说 -
绑定到类的方法 - 用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> #查看结果为普通函数