10.31-11.4 周末总结

一、ATM项目

文件夹 文件作用 文件内容
bin文件夹 binary二进制,可执行的二进制文件 可执行的文件
conf文件夹 Config(配置)存放相关配置文件 用户、商品文件路径,日志文件配置
core文件夹 source(源码)用来存放源代码以区别开其它文件 存放需求,登录、注册、转账…
db文件夹 database(数据库)组织、存储和管理数据的仓库 数据层,查看数据修改数据
inteface文件夹 interface(接口)接口文件夹,存放接口文件 银行业务接口,用户业务接口,购物业务接口
lib文件夹 library(库,图书馆)存放共用方法或者库 装饰器,获取用户名,获取日志对象
log文件夹 log(日志)用来记录日志用户操作的文档 记录用户操作信息
ATM

三层架构逻辑

第一层:只做数据展示和简单的数据获取
第二层:真正的核心业务逻辑和处理(代码)
第三层:数据操作

二、编程思想

1.面向过程

​ 面向过程编程,就是提出问题后,按照流程一步步的来解决问题。核心是过程二字,就像流水生产产品,从原材料的准备到最后的成品,是按部就班的。

优点:可以将复杂的问题一步步分割,简化
缺点:扩展性差

2.面向对象

​ 面向对象编程,重点是数据和功能的绑定。核心是对象,就像女娲造人一样,究竟对象将来的结果如何,并不是程序员关心的。我们的重点放在数据和功能的绑定。

优点:程序的耦合性高,扩展性强
缺点:编程更加复杂,难度高

​ 无论是面向对象编程还是面向过程编程,没有孰优孰劣,只有针对项目中不同的功能,使用合适的方法,做到两者相互结合,相互交融,让项目更加优化才是最终的答案。

三、对象与类

​ 面相对象的核心是对象,而对象是数据和公共的结合体

的创建使用了一条新的语句,class语句。类就是一些函数的宝,这些函数大量地使用并出泪内置对象类型,类的设计是为了创建和管理新的对象。类的属性提供了行为(数据以及函数),所有从类产生的实例都继承该类的属性。

继承是一种代码定制和复用的机制。

四、类与对象的创建

在程序中,如果要产生对象,则需要先定义类

1.类的语法结构

1)class是定义类的关键字

2)类名需要首字母大写

3)数据是变量名与数据值的绑定,类中内部的函数就是方法

class C1(C2,C3): 
    def setname(self, who):
        self.name = who

        
I1 = C1()
I2 = C1()
I1.setname('duoduo')
I2.setname('jojo')
print(I1.name)

image-20221104195207964

当def 语法出现在类的内部时,通常称为方法,而且会自动接收第一个特殊参数(self)

2.类的定义与调用

​ 类在定义阶段就会执行类体代码,但是属于类的局部名称空间,外界无法调用。

1.定义类

# 定义类
class Sfinal:
    print('恭喜deft圆梦')
    # 对象公共的数据
    one = 'deft'

    # 对象功能的方法(功能)
    def champion(self):
        print('deft')

通过类产生的对象都可以使用该类中的方法和数据

2.查看名称空间的方法

1 __dict__方法

1. __dict__方法

1)类名.__dict__ 查看类的名称空间中的名字,包括隐藏的名字

print(Sfinal.__dict__)  # 查询的方法本质是__dict__方法
---------------结果-------------------
恭喜deft圆梦
{'__module__': '__main__', 'one': 'deft', 'champion': <function Sfinal.champion at 0x104503820>, '__dict__': <attribute '__dict__' of 'Sfinal' objects>, '__weakref__': <attribute '__weakref__' of 'Sfinal' objects>, '__doc__': None}


2)类名.__dict__.get(方法名/数据名) 
查看类的名称空间中的方法或者数据,查看数据则直接得到数据,查看方法则得到方法的内存地址名

print(Sfinal.__dict__.get('one'))
print(Sfinal.__dict__.get('champion'))
-----------------结果-------------------
恭喜deft圆梦
deft

<function Sfinal.champion at 0x100963820>

2 点号运算法

在python中简化了__dict__方法,可以用点的方式去获取类中的名字

# "在面向对象中,类和对象访问数据或者功能,可以统一采用句点符"
print(Sfinal.one)
print(Sfinal.champion)
-----------------结果-------------------
恭喜deft圆梦
deft

<function Sfinal.champion at 0x10334f820>

3.类的调用

(1)类名加括号就会产生类的对象,并且每执行一次都会产生一个全新的对象

(2)使用__dict__查看名称空间中的内容是,返回 {} 表示这三个对象都只有类中相同(公共)的功能和数据,不具备独特的数据和功能

(3)__dict__可以简化为点号运算符,来调用对象中的方法

obj1 = Sfinal()       
print(obj1)           
print(obj1.__dict__)  
print(obj1.one)       
print(obj1.champion)  
--------------------
<__main__.Sfinal object at 0x1025ebf10>
{}
deft
<bound method Sfinal.champion of <__main__.Sfinal object at 0x1025ebf10>>

{} 表示这三个对象都只有类中相同(公共)的功能和数据,不具备独特的数据和功能

数据和功能 也可以统称为属性,数据:属性名 功能:方法

五、添加对象独有的数据

​ 定义名为__init__的函数,其可以专门给该类产生的对象添加独有数据的功能(类产生对象的过程中自动触发)

# 定义类                     
class Sfinal:             
    def __init__(self, one, only, team): 
        # 对象公共的数据         
        self.one = one    
        self.only = only  
        self.team = team  
                          
    # 对象功能的方法(功能)         
    def champion(self):   
        print('deft')     
        
obj1 = Sfinal('deft', 'deft', 'drx')
print(obj1.one)  # deft       

当对象公共的数据使用了双下init方法,则可以为其添加对象独有的数据

六、对象独有的功能

类的特点是:

定义在类中的功能,默认就是绑定给对象使用的,谁来调谁就是主人公,也就是说对象调用会自动将对象本身当做第一个参数传入。

# 定义类
class Sfinal:
    def __init__(self, one, only, team):
        # 对象公共的数据
        self.one = one
        self.only = only
        self.team = team

    # 对象功能的方法(功能)
    def champion(self):
        print(f'恭喜{self.one}追梦终成功,带领{self.team}夺冠')

obj1 = Sfinal('deft', 'deft', 'drx')
print(obj1.champion())
obj2 = Sfinal('faker', 'faker', 'T1')
print(obj2.champion())
-------------------------------
恭喜deft追梦终成功,带领drx夺冠
None
恭喜faker追梦终成功,带领T1夺冠
None

则可以看出,self的特性使得对象的功能从某种角度来说,即公共又独有,公共于形式,独有于内容。

2.对象修改和新增键值对

  • 对象修改数据值
obj1.name= 'Meiko'  # 当点的名字已经存在的情况下 则修改对应的值
  • 对象新增数据值
obj1.only = 'faker'  # 当点的名字不存在的情况下 则新增数据
print(obj1.__dict__)

七、定义动静态方法

1.动态函数 被@classmethod修饰的函数

被@classmethod修饰的函数,按照语法特性会自动将类的名字传入使用;而该类所产生的对象也可以调用,并会自动将产生该对象的类的名字传进去使用。

2.静态函数 被@staticmethod修饰的函数

被@staticmethod修饰的函数为普通函数,没有特别语法。无论是类还是对象调用该函数,都必须自己手动传参。

# 定义类
class Sfinal:
    s12 = 'drx'

    # @classmethod修饰的动态函数
    @classmethod
    def func1(cls, one, team):  # cls会自动将类名传进去
        print(f'恭喜{one}追梦终成功,带领{team}夺得{cls}冠军')
 
    # @staticmethod修饰的静态函数
    @staticmethod
    def func2(one, team):
        print(f'恭喜{one}追梦终成功,带领{team}夺冠')

obj1 = Sfinal()
obj1.func1('deft', 'drx')
obj2 = Sfinal()
obj2.func2('deft', 'drx')
---------------------------
恭喜deft追梦终成功,带领drx夺得<class '__main__.Sfinal'>冠军
恭喜deft追梦终成功,带领drx夺冠

八、面向对象-继承

1.继承的语法

class Son(Father):
    pass
# Son就继承了Father中所有的数据和方法

2.名字查找的顺序

1 不继承的情况下

不继承的情况下,对象查找名字的顺序
1)先从自己的名称空间中查找
2)自己没有再去产生该对象的类中查找
3)如果类中也没有,那么直接报错
对象自身名称空间 >>>>.类名称空间

2 继承的情况下

继承的情况下,对象查找名字的顺序

对象点名字,永远要先从对象自身开始一步步查找

image-20221106151239730

在类树中,高度不同时,会从最低位置,优先获得名字;高度相同时,会从左到右(也就是填写父类的顺序),来查询名字。

九、派生方法super

派生方法是子类基于父类的某个方法做了扩展。

调用super()会得到一个特殊的对象,该对象专门用来引用父类的属性,也就是在父类的方法的基础上扩展了属于子类的独特的属性

super()方法 的语法结构

# 完整语法
super(自己的类名, self).想要调用的父类的方法(形参)
# 在形参中无需填写self参数,会自动传入对象的名字
posted @ 2022-11-06 17:55  Duosg  阅读(22)  评论(0编辑  收藏  举报