Python中类和对象的绑定及非绑定方法是什么

免费教程   2024年05月07日 18:17  

本篇内容主要讲解“Python中类和对象的绑定及非绑定方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中类和对象的绑定及非绑定方法是什么”吧!

类中定义的方法大致可以分为两类:绑定方法和非绑定方法。其中绑定方法又可以分为绑定到对象的方法和绑定到类的方法。

一、绑定方法1 对象的绑定方法

在类中没有被任何装饰器修饰的方法就是 绑定到对象的方法,这类方法专门为对象定制。

classPerson:country="China"def__init__(self,name,age):self.name=nameself.age=agedefspeak(self):print(self.name+','+str(self.age))p=Person('Kitty',18)print(p.__dict__){'name':'Kitty','age':18}print(Person.__dict__['speak'])<functionPerson.speakat0x10f0dd268>

speak即为绑定到对象的方法,这个方法不在对象的名称空间中,而是在类的名称空间中。

通过对象调用绑定到对象的方法,会有一个自动传值的过程,即自动将当前对象传递给方法的第一个参数(self,一般都叫self,也可以写成别的名称);若是使用类调用,则第一个参数需要手动传值。

p=Person('Kitty',18)p.speak()#通过对象调用#输出Kitty,18Person.speak(p)#通过类调用#输出Kitty,182 类的绑定方法

类中使用 @classmethod 修饰的方法就是绑定到类的方法。这类方法专门为类定制。通过类名调用绑定到类的方法时,会将类本身当做参数传给类方法的第一个参数。

classOperate_database():host='192.168.0.5'port='3306'user='abc'password='123456'@classmethoddefconnect(cls):#约定俗成第一个参数名为cls,也可以定义为其他参数名print(cls)print(cls.host+':'+cls.port+''+cls.user+'/'+cls.password)Operate_database.connect()

输出

<class '__main__.Operate_database'>192.168.0.5:3306 abc/123456

通过对象也可以调用,只是默认传递的第一个参数还是这个对象对应的类。

Operate_database().connect()#输出结果一致#输出<class'__main__.Operate_database'>192.168.0.5:3306abc/123456二、非绑定方法

在类内部使用 @staticmethod 修饰的方法即为非绑定方法,这类方法和普通定义的函数没有区别,不与类或对象绑定,谁都可以调用,且没有自动传值的效果。

importhashlibclassOperate_database():def__init__(self,host,port,user,password):self.host=hostself.port=portself.user=userself.password=password@staticmethoddefget_passwrod(salt,password):m=hashlib.md5(salt.encode('utf-8'))#加盐处理m.update(password.encode('utf-8'))returnm.hexdigest()hash_password=Operate_database.get_passwrod('lala','123456')#通过类来调用print(hash_password)#输出f7a1cc409ed6f51058c2b4a94a7e1956p=Operate_database('192.168.0.5','3306','abc','123456')hash_password=p.get_passwrod(p.user,p.password)#也可以通过对象调用print(hash_password)#输出0659c7992e268962384eb17fafe88364

简而言之,非绑定方法就是将普通方法放到了类的内部。

三、练习

假设我们现在有一个需求,需要让Mysql实例化出的对象可以从文件settings.py中读取数据。

#settings.pyIP='1.1.1.10'PORT=3306NET=27#test.pyimportuuidclassMysql:def__init__(self,ip,port,net):self.uid=self.create_uid()self.ip=ipself.port=portself.net=netdeftell_info(self):"""查看ip地址和端口号"""print('%s:%s'%(self.ip,self.port))@classmethoddeffrom_conf(cls):returncls(IP,NET,PORT)@staticmethoddeffunc(x,y):print('不与任何人绑定')@staticmethoddefcreate_uid():"""随机生成一个字符串"""returnuuid.uuid1()#学习中遇到问题没人解答?小编创建了一个Python学习交流:711312441#默认的实例化方式:类名()obj=Mysql('10.10.0.9',3307,27)obj.tell_info()10.10.0.9:33071 绑定方法小结

如果函数体代码需要用外部传入的类,则应该将该函数定义成绑定给类的方法

如果函数体代码需要用外部传入的对象,则应该将该函数定义成绑定给对象的方法

#一种新的实例化方式:从配置文件中读取配置完成实例化obj1=Mysql.from_conf()obj1.tell_info()#输出1.1.1.10:27print(obj.tell_info)#输出<boundmethodMysql.tell_infoof<__main__.Mysqlobjectat0x10f469240>>print(obj.from_conf)#输出<boundmethodMysql.from_confof<class'__main__.Mysql'>>2 非绑定方法小结

如果函数体代码既不需要外部传入的类也不需要外部传入的对象,则应该将该函数定义成非绑定方法/普通函数

obj.func(1,2)#输出不与任何人绑定Mysql.func(3,4)#输出不与任何人绑定print(obj.func)#输出<functionMysql.funcat0x10f10e620>print(Mysql.func)#输出<functionMysql.funcat0x10f10e620>print(obj.uid)#输出a78489ec-92a3-11e9-b4d7-acde48001122

到此,相信大家对“Python中类和对象的绑定及非绑定方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

域名注册
购买VPS主机

您或许对下面这些文章有兴趣:                    本月吐槽辛苦排行榜

看贴要回贴有N种理由!看帖不回贴的后果你懂得的!


评论内容 (*必填):
(Ctrl + Enter提交)   

部落快速搜索栏

各类专题梳理

网站导航栏

X
返回顶部