前言

1、三大编程范式:

面向过程编程

函数式编程

面向对象编程

2、编程进化论

1.编程最开始就是无组织无结构,从简单控制流中按步写指令

2.从上述的指令中提取重复的代码块或逻辑,组织到一起,便实现了代码重用,且代码由无结构走向了结构化,创建程序的过程变得更具逻辑性

3.我们定义函数都是独立于函数外定义变量,然后作为参数传递给函数,这意味着:数据与动作是分离的

4.如果我们把数据和动作内嵌到一个结构(函数或类)里面,那么我们就有了一个“对象系统”(对象就是数据与函数整合到一起的产物)

3、面向对象设计

面向对象设计(Object oriented design):将一类具体事物的数据和动作整合到一起,即面向对象设计

面向对象编程(object-oriented programming):用定义类+实例/对象的方式去实现面向对象的设计

4、类和对象定义

类:类是一种数据结构,就好比一个模型,该模型用来表述一类事物(事物即数据和动作的结合体),用它来生产真实的物体(实例)

对象:睁开眼,你看到的一切的事物就是一个个的对象,你可以把对象理解成一个具体的事物

类和对象的关系:对象都是由类产生的,上帝造人,上帝首先由一个造人的模板,这个模块即人的类,然后上帝根据类的定义来生产一个个的人

实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫一个实例(实例=对象)

1、初识类

定义

'''
class 类名:
'类的文档字符串'
类体
''' #创建一个类
class Chinese:
pass #实例化出一个对象p1
p1=Chinese()

经典类和新式类

#经典类:
class 类名:
pass #新式类:
class 类名(父类): # class 类名(object)
pass

大前提:

1、只有在python2中才分新式类和经典类,python3中统一都是新式类
2、新式类和经典类声明最大不同在于,所有新式类必须继承至少一个父类
3、所有类不管是否显式声明父类,都有一个默认继承object父类

2、类的属性

2.1划分

类是用来描述一类事物,类的对象是指这一类事物的一个个体。是事物就有属性,属性分为

1、数据属性:就是变量
2、函数属性:就是函数,就是在类中的方法

类和对象均用.来访问自己的属性

2.2访问方式

查看类属性有2种方式

dir(类名):查出的是一个属性名字列表
类名.__dict__:查出的是一个字典

class Chinese:
work = "程序员" def sleep():
print("晚上12点睡觉") def eat(self):
print("点好外卖,送餐中") print(Chinese.work) # 加点本质上就是查__dict__的属性字典。
Chinese.sleep()
Chinese.eat(1)

#原理如下
print(Chinese.__dict__) # 查看类的属性字典
#结果为:{'__module__': '__main__', 'work': '程序员', 'sleep': <function Chinese.sleep at 0x0088E1E0>, 'eat': <function Chinese.eat at 0x0088E270>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None}
print(Chinese.__dict__["work"])
Chinese.__dict__["sleep"]()#通过属性字典找到该函数属性的内存地址,然后加()运行该函数
Chinese.__dict__["eat"](1) # 类的其他属性
print(Chinese.__name__) # Chinese 类Chinese的名字(字符串)
print(Chinese.__doc__) #None 文档字符串
print(Chinese.__module__) #__main__ 模块 print(Chinese.__base__) #<class 'object'> 类的第一个父类
print(Chinese.__bases__) # (<class 'object'>,) 类的所有父类构成的元组
print(Chinese.__dict__) # 类的属性
print(Chinese.__class__) #<class 'type'> 实例对应的类(仅新式类中)

3、面向对象的程序设计

例1

def Chinese(name,age,sex):

    def init(name,age,sex):
dic={"name":name,
"age":age,
"sex":sex,
"sleep":sleep,
"eat":eat
}
return dic def sleep():
print("晚上12点睡觉") def eat(dic):
print("%s点好外卖,送餐中" %dic["name"]) return init(name,age,sex) p1=Chinese("steven","","男")
p1["sleep"]() #晚上12点睡觉
p1["eat"](p1)#steven点好外卖,送餐中

例2

class Chinese:
work = "程序员" def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex def sleep():
print("晚上12点睡觉") def eat(self):#self就是实例自己
print("%s点好外卖,送餐中" %self.name) p1=Chinese("steven","","男")#相当于p1=Chinese.__init__(p1,"袁浩","18","female")
#p1.sleep() 报错,不需要传参数却传了个参数。因为class自动处理相当于执行了p1.sleep(p1),因此,类中的方法在创建的时候要传一个参数self。如def sleep(self)
p1.eat() print(p1.__dict__) #显示实例的属性字典
print(Chinese.__dict__) #显示类的实例字典
# print(p1.name)
# print(p1.__dict__["name"])
#Chinese.sleep()     #运行表示是类调用方法,跟实例没关系
#Chinese.eat(p1)

执行结果为:

steven点好外卖,送餐中
{'name': 'steven', 'age': '25', 'sex': '男'}
{'__module__': '__main__', 'work': '程序员', '__init__': <function Chinese.__init__ at 0x00E3E1E0>, 'sleep': <function Chinese.sleep at 0x00E3E270>, 'eat': <function Chinese.eat at 0x00E3E2B8>, '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>, '__doc__': None}  

总结:

1、两个例子都应用了面向对象的思想。使用class定义类不代表一定是面向对象,用面向对象编程语言编程不一定就是面向对象,用非面向对象语言也能实现面向对象,面向对象是一种设计思想。

2、例2对比例1,使用__init__方法,相当于自动生成了属性字典并返回,就不需要return。实例化时会触发该函数运行。

3、实例就只有数据属性,没有函数属性

4、属性的增删改查

#====== 类属性的增删改查=====
class Chinese:
work = "程序员" def __init__(self,name):
self.name = name def play_ball(self,ball):
print("%s 正在打 %s" % (self.name, ball)) # 查询
print(Chinese.work)
# 修改
Chinese.work = '复仇者'
print(Chinese.work)
# 增加
Chinese.country = "china"
print(Chinese.country)
# 删除
print(Chinese.__dict__)
del Chinese.country
print(Chinese.__dict__) # 增加类的函数属性
def eat_foot(self, food):
print("正在吃%s" % food) Chinese.eat = eat_foot
print(Chinese.__dict__) # 修改类的函数属性(重新增加一个属性,覆盖要修改的属性)
# 略 # =====实例属性的增删改查=====
p1 = Chinese("steven")
print(p1.__dict__)
# 查看
print(p1.name)
print(p1.play_ball) # 增加实例的数据属性
p1.age = 18
print(p1.__dict__) #{'name': 'steven', 'age': 18}
print(p1.age) # 增加实例的函数属性。(一般不这么用)
def test(self):
print("来自实例的函数属性")
p1.test = test
print(p1.__dict__)
#p1.test() # 这里会报错,提示缺少请求参数。实例只有在调用类的函数属性时才自动加上self参数。 # 修改
p1.age = 19
print(p1.__dict__)
print(p1.age) # 删除
del p1.age
print(p1.__dict__)

5、作用域

#-----场景1-----
class Chinese:
work = "程序员" def __init__(self, name):
self.name = name def play_ball(self, ball):
print("%s 正在打 %s" % (self.name, ball)) p1 = Chinese("steven")
print(p1.work) p1.work = "医生"
print(Chinese.work) # "程序员"
print(p1.work) # "医生" #-----场景2-----
work = "程序员"
class Chinese: def __init__(self,name):
self.name = name
print("---->",work) def play_ball(self, ball):
print("%s 正在打 %s" % (self.name, ball)) p1 = Chinese("steven") # 执行结果为"----> 程序员"。如果类或实例加点进行访问,访问的只能是类或实例的作用域。这里没加点所以能输出。
#print(Chinese.work) 报错,只能访问类自己的作用域,不能访问到外部的work
#print(p1.work)报错 #------场景3-----
work = "程序员"
class Chinese:
work= "律师"
l = ["a", "b"]
def __init__(self,name):
self.name = name
print("---->", work) def play_ball(self, ball):
print("%s 正在打 %s" % (self.name, ball)) print(Chinese.__dict__)
print(Chinese.work) # "律师"。
p1 = Chinese("steven") # 结果为"----> 程序员"。因为在类里面定义的都跑到类的字典里去了,没有用点访问跟实例和类都没关系不会从类或实例的字典里去找,只是个普通变量
print("实例---》", p1.work) # "实例---》 律师"。通过点的方式调用,就会从类内部去找 #-----场景四-----
work = "程序员"
class Chinese:
work= "律师"
l = ["a", "b"]
def __init__(self,name):
self.name = name
print("---->", work) def play_ball(self, ball):
print("%s 正在打 %s" % (self.name, ball)) p1 = Chinese("steven")
print(p1.l)
# p1.l=[1,2,3]
# print(Chinese.l)
# print(p1.__dict__)
p1.l.append("c") # 这里p1没有l,这里拿到的l就是类的属性,改的也是类属性
print(p1.__dict__) # {"name":"steven"}
print(Chinese.l) # ["a","b","c"]
 

python学习笔记-面向对象设计的更多相关文章

  1. python学习-60 面向对象设计

    面向对象设计 1.三大编程范式 --面向过程编程 --函数式编程 --面向对象编程 2.编程进化论 --编程最开始就是无组织无结构,从简单控制流中按步写指令 --从上述的指令中提取重复的代码快或逻辑, ...

  2. python学习笔记----面向对象

    面向对象 类:成员变量(属性) 方法(操作成员变量) 出一个场景:玩过游戏.主人公,进入了一个场景,有10个小怪物是一样的.有攻击力,血(100格).如果小怪物有多个数值需要管理,小怪物的血量.小怪物 ...

  3. python学习笔记--面向对象的编程和类

    一.面向对象的编程 面向对象程序设计--Object Oriented Programming,简称oop,是一种程序设计思想.二.面向对象的特性类:class类,对比现实世界来说就是一个种类,一个模 ...

  4. Python学习笔记——面向对象基础

    1.类和实例 1.1类的定义 类的定义使用class关键字,其后紧跟类名(通常大写开头),紧接着是(object),object是该类继承的类名,没有就继承object类. 实例化时就是类名+(),有 ...

  5. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  6. Python 学习笔记(下)

    Python 学习笔记(下) 这份笔记是我在系统地学习python时记录的,它不能算是一份完整的参考,但里面大都是我觉得比较重要的地方. 目录 Python 学习笔记(下) 函数设计与使用 形参与实参 ...

  7. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  8. C#学习笔记——面向对象、面向组件以及类型基础

    C#学习笔记——面向对象.面向组件以及类型基础 目录 一 面向对象与面向组件 二 基元类型与 new 操作 三 值类型与引用类型 四 类型转换 五 相等性与同一性 六 对象哈希码 一 面向对象与面向组 ...

  9. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

随机推荐

  1. 箭头函数this

    箭头函数的this值是由包含它的函数(非箭头函数)来决定的,与包含的函数的this指向一致,如果包裹它的不是函数(直到找到最外层)则this指向全局对象 并且箭头函数的this是固定的,由定义它时所在 ...

  2. PHP数据库基础(简单的)

    经常用到的函数 $link=mysql_connect("数据库地址","用户名","密码");//链接数据库mysql_query(“se ...

  3. C# Stream篇(四) -- FileStream

    FileStream 目录: 如何去理解FileStream? FileStream的重要性 FileStream常用构造函数(重要) 非托管参数SafeFileHandle简单介绍 FileStre ...

  4. UVA - 11892 ENimEN(博弈)

    题意:有n堆石子,两个人拿,拿走最后的石子的人赢,poopi先拿,条件是,每个人必须从另外一个人最后拿过的石子堆中取石子,若那堆石子被拿没了,才可以自由地拿其他堆.要求每次拿的石子数不能为0.问谁赢. ...

  5. AVCodec 结构体

    typedef struct AVCodec { // 标示Codec 的名字, 比如,"h264" "h263" 等. const char *name; / ...

  6. 进度5_家庭记账本App_数据库的添加和查看

    今天继续在昨天的基础上完成了家庭记账单的在数据库中的添加和查看功能 在之前的基础上舍弃了Fragment,重新在百度上找到了学习资料,并且自我完成了实践 首先在之前的基础上创建CostListAdap ...

  7. oracle数据库语言(1)--数据定义语言

      1.数据定义语言 (DDL)DATE DEFINITION LANGUAGE 作用是用于增删改 数据库对象 (1) 创建表格 CREATE TABLE EMP ( -------创建 名为 EMP ...

  8. QT设计

    MFC是跨平台的一个界面开发的类库 框架是什么呢? 1.基础模块 2.机制交互(数据传输) 3.多种语言 QT core QT gui QT widget QT 1.基础模块 2.拓展模块 3.too ...

  9. BZOJ 2226 [Spoj 5971] LCMSum

    题解:枚举gcd,算每个gcd对答案的贡献,贡献用到欧拉函数的一个结论 最后用nlogn预处理一下,O(1)出答案 把long long 打成int 竟然没看出来QWQ #include<ios ...

  10. c# 数据库操作,多数据库操作、数据库操作异常报错等问题

    1.引入相关的命名空间 在C#中要操作数据库,一般情况需要引入两个命名空间,在三种连接模式中都要引入下面的命名空间: System.Data;描述与数据源连接的当前状态. // // 摘要: // 连 ...