目录
一、ATM项目
文件夹 | 文件作用 | 文件内容 |
---|---|---|
bin文件夹 | binary二进制,可执行的二进制文件 | 可执行的文件 |
conf文件夹 | Config(配置)存放相关配置文件 | 用户、商品文件路径,日志文件配置 |
core文件夹 | source(源码)用来存放源代码以区别开其它文件 | 存放需求,登录、注册、转账… |
db文件夹 | database(数据库)组织、存储和管理数据的仓库 | 数据层,查看数据修改数据 |
inteface文件夹 | interface(接口)接口文件夹,存放接口文件 | 银行业务接口,用户业务接口,购物业务接口 |
lib文件夹 | library(库,图书馆)存放共用方法或者库 | 装饰器,获取用户名,获取日志对象 |
log文件夹 | log(日志)用来记录日志用户操作的文档 | 记录用户操作信息 |
三层架构逻辑
第一层:只做数据展示和简单的数据获取
第二层:真正的核心业务逻辑和处理(代码)
第三层:数据操作
二、编程思想
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)
当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 继承的情况下
继承的情况下,对象查找名字的顺序
对象点名字,永远要先从对象自身开始一步步查找
在类树中,高度不同时,会从最低位置,优先获得名字;高度相同时,会从左到右(也就是填写父类的顺序),来查询名字。
九、派生方法super
派生方法是子类基于父类的某个方法做了扩展。
调用super()
会得到一个特殊的对象,该对象专门用来引用父类的属性,也就是在父类的方法的基础上扩展了属于子类的独特的属性
super()方法 的语法结构
# 完整语法
super(自己的类名, self).想要调用的父类的方法(形参)
# 在形参中无需填写self参数,会自动传入对象的名字
标签:__,10.31,deft,11.4,self,Sfinal,周末,对象,print
From: https://www.cnblogs.com/DuoDuosg/p/16863228.html