博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三 面向对象之绑定方法与非绑定方法
阅读量:5884 次
发布时间:2019-06-19

本文共 2317 字,大约阅读时间需要 7 分钟。

一 绑定方法

二 非绑定方法

三 classmethod和staticmethod的区别

 

一 绑定方法

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

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

                为类量身定制

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

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

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

               为对象量身定制

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

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

绑定给类的方法(classmethod)

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

1 HOST='127.0.0.1'2 PORT=33063 DB_PATH=r'C:\Users\Administrator\PycharmProjects\test\面向对象编程\test1\db'
setting.py
1 import settings 2 class MySQL: 3     def __init__(self,host,port): 4         self.host=host 5         self.port=port 6  7     @classmethod 8     def from_conf(cls): 9         print(cls)10         return cls(settings.HOST,settings.PORT)11 12 print(MySQL.from_conf) #
>13 conn=MySQL.from_conf()14 15 conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类

 

二 非绑定方法

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

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

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

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

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

1 import hashlib 2 import time 3 class MySQL: 4     def __init__(self,host,port): 5         self.id=self.create_id() 6         self.host=host 7         self.port=port 8     @staticmethod 9     def create_id(): #就是一个普通工具10         m=hashlib.md5(str(time.time()).encode('utf-8'))11         return m.hexdigest()12 13 14 print(MySQL.create_id) #
#查看结果为普通函数15 conn=MySQL('127.0.0.1',3306)16 print(conn.create_id) #
#查看结果为普通函数

 

三 classmethod和staticmethod的区别

1 import settings 2 class MySQL: 3     def __init__(self,host,port): 4         self.host=host 5         self.port=port 6  7     @staticmethod 8     def from_conf(): 9         return MySQL(settings.HOST,settings.PORT)10 11     # @classmethod #哪个类来调用,就将哪个类当做第一个参数传入12     # def from_conf(cls):13     #     return cls(settings.HOST,settings.PORT)14 15     def __str__(self):16         return '就不告诉你'17 18 class Mariadb(MySQL):19     def __str__(self):20         return '<%s:%s>' %(self.host,self.port)21 22 23 m=Mariadb.from_conf()24 print(m) #我们的意图是想触发Mariadb.__str__,但是结果触发了MySQL.__str__的执行,打印就不告诉你:
mariadb是mysql

 

转载于:https://www.cnblogs.com/eric_yi/p/8452346.html

你可能感兴趣的文章
记录一次Mac虚拟机安装的过程(有图有真相)
查看>>
SubSonic3.0插件分页查询速度测试
查看>>
如何设置 Panorama 控件的只读 SelectedIndex 属性?
查看>>
TPS5410/TPS5430 开关电源稳压器(DC-DC)
查看>>
.net asp 在1.asp页面嵌入另一个页面2.asp
查看>>
DDD~Unity在DDD中的使用
查看>>
golang显示本机IP代码
查看>>
Linux——用户管理简单学习笔记(二)
查看>>
android UI进阶之用ViewPager实现欢迎引导页面
查看>>
SAP Study Notes: BW Queriy-Variables(变量)
查看>>
Android_Bitmap_图片的二次采样并生成缩略图
查看>>
R统计软件真有意思哈,以后我怕要用得着,先自学
查看>>
Git分布式开发之生成ssh公钥
查看>>
2013第47周六笔记本散热及相关问题思考
查看>>
.NET:如何让线程支持超时?
查看>>
linearlist和linkedlist的区别 待整理
查看>>
Linux进程间通信
查看>>
红蓝眼睛逻辑问题推理
查看>>
用命令让vbox的虚拟硬盘文件转换成vmware的vmdk
查看>>
【py分析】使用SGMLParser分析淘宝html
查看>>