Python面向对象:绑定方法与非绑定方法

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

一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

  1. 绑定到类的方法:用classmethod装饰器装饰的方法

1

2

3

为类量身定制

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

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

  2.绑定到对象的方法:没有被任何装饰器装饰的方法

1

2

3

为对象量身定制

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

(属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

 

二、非绑定方法:用staticmethod装饰器装饰的方法

 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说,就是一个普通工具而已

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

绑定方法

绑定给对象的方法

绑定给类的方法(classmethod)

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

HOST = '127.0.0.1'

PORT = 3306

DB_PATH = 'db'

db_path = ''

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()

conn.from_conf()    # 对象也可以调用,但是默认传的第一个参数任然是类

非绑定方法

在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数

staticmethod不与类或对象绑定,谁都可以调用,没有自动传值效果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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():    # 就是一个普通工具

        = hashlib.md5(str(time.time()).encode('utf-8'))

        return m.hexdigest()

print(MySQL.create_id())

conn = MySQL('127.0.0.1'3306)

print(conn.create_id())

  classmethod与staticmethod的对比

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

import settings

class MySQL:

    def __init__(self, host, port):

        self.host = host

        self.port = port

    @staticmethod

    def from_conf():

        return MySQL(settings.HOST, settings.PORT)

    def __str__(self):

        return '就不告诉你'

class Mariadb(MySQL):

    def __str__(self):

        return '<%s:%s>' % (self.host, self.port)

= Mariadb.from_conf()

print(m)        # 我们的意图是想触发Mariadb.__str__,但是结果触发了MySQL.__str__的执行,打印就不告诉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值