python学习第七天回顾(绑定方法与非绑定方法,staticmethod与classmethod,面向对象的软件开发)
| 一、绑定方法与非绑定方法 |
###类中定义的函数分成两大类:
1 一、绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 2 1、绑定到类的方法:用classmethod装饰器装饰的方法。 3 #为类量身定制 4 类.boud_method(),自动将类当作第一个参数传入(其实对象也可调用,但仍将类当作第一个参数传入) 5 2、绑定到对象的方法:没有被任何装饰器装饰的方法。 6 #为对象量身定制 7 对象.doud_method(),自动将对象当作第一个参数传入(属于类函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说) 8 <<<在类内部定义的函数都是绑定方法>>>
1 二:非绑定方法:用staticmethod装饰器装饰的方法 2 1、不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已 3 #注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说
1 #示例: 2 3 class Foo: 4 def test1(self): 5 pass 6 @classmethod 7 def test2(cls): 8 print(cls) 9 @staticmethod 10 def test3(): 11 pass 12 13 f=Foo() 14 print(f.test1) 15 print(Foo.test2) 16 print(Foo.test3) 17 print(f.test3)
1 #返回结果为: 2 <bound method Foo.test1 of <__main__.Foo object at 0x000001AD8AA99C50>> #绑定到类的对象 3 <bound method Foo.test2 of <class '__main__.Foo'>> #绑定到类 4 <function Foo.test3 at 0x000001AD8AA9BA60> #绑定到对象 5 <function Foo.test3 at 0x000001AD8AA9BA60>
# 以上,在未使用classmethod或staticmethod时,绑定的是类的对象; classmethod绑定的是类;
1 # @classmethod绑定类的方法 2 class Foo: 3 @classmethod 4 def test(cls): 5 print("cls") 6 Foo.test() 7 print(Foo) 8 f=Foo() 9 f.test()
#!/usr/bin/env python # -*- coding:utf-8 -*- HOST="192.168.1.23" PORT=3306
1#绑定方法的体现
2 import settings 3 class MySQL: 4 def __init__(self,host,port): 5 self.host=host 6 self.port=port 7 print("conneting...") 8 @classmethod 9 def from_conf(cls): 10 return cls(settings.HOST,settings.PORT) 11 12 def select(self): 13 print(self) 14 print("select funciton %s" % self.host) 15 16 conn = MySQL("127.0.0.1",3306) 17 conn.select() 18 19 conn2= MySQL.from_conf() 20 print(conn2.host)
1 #返回结果为: 2 select funciton 127.0.0.1 3 conneting... 4 192.168.1.23
1 #classmethod与staticmethod的区别 2 3 import settings 4 class MySQL: 5 def __init__(self,host,port): 6 self.host=host 7 self.port=port 8 print("conneting...") 9 @classmethod 10 def from_conf(cls): 11 return cls(settings.HOST,settings.PORT) 12 13 # @staticmethod 14 # def from_conf(cls): 15 # return cls(settings.HOST, settings.PORT) 16 def __str__(self): 17 return "MySQL...." 18 19 def select(self): 20 print(self) 21 print("select funciton %s" % self.host) 22 class Mariab(MySQL): 23 def __str__(self): 24 return "host:%s port:%s" %(self.host,self.port) 25 # return "Mariab..." 26 conn1 = Mariab.from_conf() 27 conn2 = Mariab("192.168.0.120","3307") 28 print(conn1) 29 print(conn2)
#用staticmethod #返回的结果为: conn1 = Mariab.from_conf() TypeError: from_conf() missing 1 required positional argument: 'cls'
#用classmethod #返回的结果为: conneting... conneting... host:192.168.1.23 port:3306 host:192.168.0.120 port:3307
#classmethod调用的是类的属性,而staticmethod调用的并非是类的属性,所以会报错
1 #__str__的应用 2 #必须有返回值,而且是字符串类型 3 #示例: 4 def __str__(self): 5 return "MySQL...."
# import hashlib # import time # def create_id(): # m=hashlib.md5(str(time.clock()).encode('utf-8')) # return m.hexdigest() # print(time.clock()) # print(time.clock()) # print(time.clock()) # print(create_id()) # print(create_id()) # print(create_id()) # print(create_id()) # import hashlib # import time # import settings # class MySQL: # def __init__(self,host,port): # self.id=self.create_id() # self.host=host # self.port=port # print('conneting...') # # @staticmethod # def create_id(): #非绑定方法,就是类中的普通工具包 # m=hashlib.md5(str(time.clock()).encode('utf-8')) # return m.hexdigest() # # @classmethod # def from_conf(cls): # return cls(settings.HOST,settings.PORT) #MySQL('127.0.0.1',3306) # def select(self): #绑定到对象的方法 # print(self) # print('select function') # conn=MySQL('192.168.1.3',3306) # conn.select() # conn1=MySQL('192.168.1.3',3306) # conn1=MySQL.from_conf() # conn2=MySQL.from_conf() # conn3=MySQL.from_conf() # conn4=MySQL.from_conf() # # print(conn1.id) # print(conn2.id) # print(conn3.id) # print(conn4.id)
| 二、面向对象的软件开发 |
1 #面向对象的软件工程包括下面几个部分: 2 1、面向对象分析(OOA)
# 软件工程中的系统分析阶段,要求分析员和用户结合在一起,对用户的需求做出精确的分析和明确的表述,从大的方面解析软件系统应该做什么,而不是怎么去做。
面向对象的分析要按照面向对象的概念和方法,在对任务的分析中,从客观存在的事物和事物之间的关系,贵南出有关的对象(对象的‘特征’和‘技能’)以及对象之间的联系,并将具有相同属性和行为的对象用一个类class来标识。 <<< 就是所谓的需求分析>>>
3 2、面向对象设计(OOD)
#根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计。 #首先是类的设计,类的设计可能包含多个层次(利用继承与派生机制)。然后以这些类为基础提出程序设计的思路和方法,包括对算法的设计。 #在设计阶段并不牵涉任何一门具体的计算机语言,而是用一种更通用的描述工具(如伪代码或流程图)来描述
4 3、面向对象编程(OOP)
#根据面向对象设计的结果,选择一种计算机语言把它写成程序,就是写代码阶段,可以是python,当然也可以是其他语言
5 4、面向对象测试(OOT)
#在写好程序后交给用户使用前,必须对程序进行严格的测试,测试的目的是发现程序中的错误并修正它。 #面向对的测试是用面向对象的方法进行测试,以类作为测试的基本单元。
6 5、面向对象维护(OOSM)
#正如对任何产品都需要进行售后服务和维护一样,软件在使用时也会出现一些问题,或者软件商想改进软件的性能,这就需要修改程序。 #由于使用了面向对象的方法开发程序,使用程序的维护比较容易。 #因为对象的封装性,修改一个对象对其他的对象影响很小,利用面向对象的方法维护程序,大大提高了软件维护的效率,可扩展性高。 #在面向对象方法中,最早发展的肯定是面向对象编程(OOP),那时OOA和OOD都还没有发展起来,因此程序设计者为了写出面向对象的程序,还必须深入到分析和设计领域,
尤其是设计领域,那时的OOP实际上包含了现在的OOD和OOP两个阶段,这对程序设计者要求比较高,许多人感到很难掌握。 #现在设计一个大的软件,是严格按照面向对象软件工程的5个阶段进行的,这个5个阶段的工作不是由一个人从头到尾完成的,而是由不同的人分别完成,这样OOP阶段的任务就比较简单了。程序编写者只需要根据OOd提出的思路,用面向对象语言编写出程序既可。 #在一个大型软件开发过程中,OOP只是很小的一个部分。 #对于全栈开发的你来说,这五个阶段都有了,对于简单的问题,不必严格按照这个5个阶段进行,往往由程序设计者按照面向对象的方法进行程序设计,包括类的设计和程序的设计
| ###初学者容易犯的错误 |
1.面向对象的程序设计看起来高大上,所以我在编程时就应该保证通篇class,这样写出的程序一定是好的程序(面向对象只适合那些可扩展性要求比较高的场景) 2.很多人喜欢说面向对象三大特性(这是从哪传出来的,封装,多态,继承?漏洞太多太多,好吧暂且称为三大特性),那么我在基于面向对象编程时,我一定要让我定义的类中完整的包含这三种特性,这样写肯定是好的程序 3.类有类属性,实例有实例属性,所以我们在定义class时一定要定义出那么几个类属性,想不到怎么办,那就使劲的想,定义的越多越牛逼 这就犯了一个严重的错误,程序越早面向对象,死的越早,为啥面向对象,因为我们要将数据与功能结合到一起,程序整体的结构都没有出来,或者说需要考虑的问题你都没有搞清楚个八九不离十,
你就开始面向对象了,这就导致了,你在那里干想,自以为想通了,定义了一堆属性,结果后来又都用不到,或者想不通到底应该定义啥,那就一直想吧,想着想着就疯了。

浙公网安备 33010602011771号