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
setting.p文件的内容
 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)
示例,hashlib,staticmethod,staticmethod

 

二、面向对象的软件开发
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时一定要定义出那么几个类属性,想不到怎么办,那就使劲的想,定义的越多越牛逼
      这就犯了一个严重的错误,程序越早面向对象,死的越早,为啥面向对象,因为我们要将数据与功能结合到一起,程序整体的结构都没有出来,或者说需要考虑的问题你都没有搞清楚个八九不离十,
    你就开始面向对象了,这就导致了,你在那里干想,自以为想通了,定义了一堆属性,结果后来又都用不到,或者想不通到底应该定义啥,那就一直想吧,想着想着就疯了。

 

 

posted @ 2017-06-15 11:20  冠彭  阅读(82)  评论(0)    收藏  举报