类中定义的方法大致可以分为两类:绑定方法和未绑定方法。其中,绑定方法可以分为绑定到对象的方法和绑定到类的方法。一、绑定方法1对象的绑定方法是类中不被任何装饰器修饰的绑定到对象上的方法,这类方法是专门为对象定制的。类Person: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'])speak是绑定到对象的方法。这个方法不在对象的命名空间中,而是在类的命名空间中。通过对象调用绑定到对象的方法会有一个自动传值过程,即当前对象会自动传递给方法的第一个参数(self,一般称为self,也可以写成另一个姓名);如果使用类调用,第一个参数需要手动传递。p=Person('Kitty',18)p.speak()#通过对象调用#OutputKitty,18Person.speak(p)#通过类调用#OutputKitty,182类的绑定方法用@classmethodA修饰方法只是绑定到类的方法。这些方法是为类定制的。当通过类名调用绑定到类的方法时,类本身作为第一个参数传递给类方法。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()output192.168.0.5:3306abc/123456也可以通过对象调用,但是默认传递的第一个参数仍然是对象对应的类。operate_database().connect()#输出结果相同#Output192.168.0.5:3306abc/1234562.非绑定方法类内部用@staticmethod修饰的方法是非绑定的绑定方法,这类方法和普通的定义函数没有什么区别,不绑定类或对象,任何人都可以调用,没有自动传值的作用。导入hashlibclassOperate_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)#Outputf7a1cc409ed6f51058c2b4a94a7e1956p=Operate_database('192.168.0.5','3306','abc','123456')hash_password=p.get_userp..password)#也可以通过对象调用print(hash_password)#output0659c7992e268962384eb17fafe88364总之,非绑定方法就是把普通方法放在类内部。3.实践假设我们现在有一个需求,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#默认实例化方式:classname()obj=Mysql('10.10.0.9',3307,27)obj.tell_info()10.10.0.9:33071绑定方法总结ifIf函数主体代码需要使用外部传递的类,函数应定义为绑定到该类的方法。函数体代码如果需要使用外部传入的对象,函数应该定义为对象绑定的方法#新的实例化方式:从配置文件中读取配置完成实例化obj1=Mysql.from_conf()obj1.tell_info()#output1.1.1.10:27print(obj.tell_info)#output<__main__.Mysql对象的绑定方法Mysql.tell_infoat0x10f469240>>print(obj.from_conf)#Output>2非绑定方法输入对象,函数应该定义为非绑定方法/普通函数obj.func(1,2)#输出不绑定任何人Mysql.func(3,4)#输出不绑定任何人print(obj.func)#outputprint(Mysql.func)#outputprint(obj.uid)#outputa78489ec-92a3-11e9-b4d7-acde48001122