一:我们之前接触的属于面向过程,侧重于———怎么做
1.把完成某一个需求的所有步骤从头到尾逐步实现
2.根据开发需求,将某些功能独立的代码封装成一个又一个函数
3.最后完成的代码,就是顺序地调用不同地函数
特点:
1.注重步骤鱼过程,不注重职责分工
2.如果希求复杂,代码会变得很复杂
3.开发复杂项目,没有固定的套路,开发难度很大
二:面向对象的说明(侧重于谁来做):
相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法
1.在完成某一个需求前,首先确定职责------要做的事情(方法)
2.根据职责确定不同的对象,在对象内部封装不同的方法(多个)
3.最后完成的代码,就是顺序地让不同的对象调用不同的方法
特点:
1.注重对象和职责,不同的对象承担不同的职责
2.更加适合应对复杂的需求变化,是专门应对复杂项目开发,提供的固定思路
3.需要在面向过程的基础上,再学习一些面向对象的语法
三.类和对象的基本概念
1.类
类是对一群具有相同特征或者行为的事物的一个统称,是抽象的,不能直接使用。负责创建对象
特征被称为属性;行为被称为方法
2.对象
是由类创建出来的具体存在,可以直接使用。由哪一个类创建出来的对象,就拥有在哪一个类中定义的属性和方法。(先有类再有对象)
四:类和对象的关系
1.类是模板,对象是根据类创建出来的
2.类只有一个,对象可以有多个
3.不同对象之间属性可能会各不相同
4.类中定义了什么属性和方法,对象中就有什么属性和方法
五:类的设计
通常需要满足三个要素
1.类名 ,满足大驼峰命名法(1.每个单词的首字母大写;2.单词有单词之间没有下划线。Eg:CapWord,Num…)
2.属性这类事物的特征
3.方法这类事物的行为(动词)
类的设计的实例(需求中没有涉及地属性或方法,在设计类时,不需要考虑):
蛋蛋今年6岁,身高1.30,每天早上跑完步会自觉地去读书
汤圆今年7岁,身高1.34,他不跑步,直接去读书
Person:name age height/run() read()
Python面相对象基本语法
dri内置函数
定义简单的类(只包含方法)
方法中的self参数
内置方法和属性
1.dri()函数
_ _方法名_ _格式的方法是python提供的内置方法/属性 eg:
方法名 __new__ 作用:创建对象时被自动调用 __init__ 作用:对象被初始化时,被自动调用
__del__ 作用:对象被从内存中销毁前,被自动调用
__str__ 作用:返回对象的描述信息,print函数输出使用
2.1创建一个类:
基本格式:class 类名:
def 方法1(self,参数列表):
pass
def 方法2(self,参数列表):
pass
例如:
classDog:
def bark(self):
print("叫了几声")
d1=Dog()#创建dog对象
d1.bark()
运行结果为:
叫了几声
2.2创建对象:语法格式:
对象变量=类名()
引用的概念
在python中使用类创建对象之后,d1变量中仍然记录的是对象在内存中的地址
也就是d1变量引用了新建的dog对象
使用print输出对象变量,默认情况下,是能够输出这个变量引用的对象是由哪个类创建的对象,以及在内存中的地址
在计算机中,通常使用十六进制表示内存地址
%d可以以10进制输出数字
%x可以以16进制输出数字
Eg:
print(d1)#计算机习惯用十六进制表示内存地址,id可以查询数据在内存中的地址
运行结果为:
<__main__.Dog object at 0x000001B645FCE388>
addr=id(d1)
print("%d" % addr)#这样打印出的格式是十进制,%x这样打印出的格式为十六进制
print("%x" % addr)
运行结果分别为:
1629546894984
17b68905688
2.3再创建一个dog对象,比如lazy_dog!=d1(二者不是同一个对象)
03.方法中的self参数
3.1给对象增加属性
但是不推荐使用。因为对象属性一个封装在类的内部。日常开发中不推荐在类的外部给对象增加属性(如果在运行时没有找到属性,程序会报错);对象包含的属性一个封装在类的内部
方法:对象变量名+”.属性名“,eg:
D1.name="大黄” 但是大黄这个名字不会输出在控制台
3.2使用self在方法内部输出每只狗的名字
由那个对象调用的方法,方法内的self就是哪个对象的引用
在类封装的方法内部,self表示当前调用方法的对象自己
调用方法时,程序员不需要传递self参数
在方法内部:可以通过self.访问对象,也可以通过self.调用其他的对象方法
Eg:
class Dog:
def bark(self):
print("%s叫了几声"%self.name)
d1=Dog()#创建dog对象
print("f.d1{self.name}")
d1.name="大黄"
d1.bark()
lazy_dog=Dog()
lazy_dog.name="大懒狗"
lazy_dog.bark()
运行结果为
大黄叫了几声
4.2初始化方法
w当使用类名创建对象时,会自动执行一下操作:
1.为对象在内存中分配空间——创建对象
2.为对象的属性设置初始值——初始化方法(init)
__init__方法是对象的内置方法,是专门用来定义一个类具有哪些属性的方法!
在dog中增加__init__方法,在创建对象时会被自动调用
class Dog:
def __init__(self):
print("这是一个初始化方法”)
d1=Dog() 这样会直接调用init函数,运行结果为: 这是一个初始化方法
4.3在初始化方法内部定义属性
可以使用self.属性名=属性的初始值这种方法来定义属性
Eg:
class Dog
def __init__(self):
print("这是一个初始化方法“)
self.name="大黄”
def bark(self):
print("%s 叫了几声”% self.name)
d1=Dog()
print(d1.name)
运行结果为:这是一个初始化方法
大黄
4.4对初始化方法进行改造
1.把希望设置的属性值,定义成__init__方法的参数2.在方法的内部使用self.属性=形参 接收外部传递的参数3.在创建对象时,使用类名(属性1,属性2,属性3…)来调用
Eg:
Class Dog
def __init__(self,name):
self.name=name
def bark(self):
print("%s 叫了几声”% self.name)
d1=Dog("大黄“)
print(d1.name)
d1.bark()
运行结果为:
这是一个初始化方法
大黄
大黄叫了几声
05.内置方法和属性
5.1__del__方法
对象从内存中销毁前,会自动调用__del__方法
Eg:
class Dog
def __init__(self,name):
self.name=name
print("这是一个初始化方法“)
def __del__(self):
print(" %s 去了"% self.name)
d1=Dog("大黄")
print(d1.name)
print("." * 3)
运行结果为:
这是一个初始化方法
大黄
***
大黄去了
再eg:
class Dog
def __init__(self,name):
self.name=name
print("这是一个初始化方法“)
def __del__(self):
print(" %s 去了" % self.name)
d1=Dog("大黄")
print(d1.name)
del d1
print("." * 3)
运行结果为:
这是一个初始化方法
大黄
大黄去了
***
5.2__str__方法 python中,使用print输出对象变量,默认情况下输出这个变量引用的对象是由哪一个类创建的对象以及在内存中的地址(一般以十六进制的形式来表示)
Eg:
<__main__.cat object at 0x7f6ee893ba20>
前面表示对象,后面表示在内存中的地址
Eg:
class Dog
def __init__(self,name):
self.name=name
print("%s 来了“% self.name)
def __str__(self):
return "我是大狗[%s]" % self.name
d1=Dog("大黄”)
print(d1)
运行结果为:大黄来了
我是大狗[大黄]
Python封装
1.面向对象编程的第一步是将属性和方法封装到一个抽象的类中;2外界使用类创建对象,然后让对象调用方法;3对象方法的细节都被封装在类的内部
实例(小酥爱跑步):
class Person:
def __init__(self,name,weight):
self.name=name
self.weight=weight
def __str__(self) :
return "她是 %s 体重为 %.1f 公斤" %(self.name,self.weight)
def run(self):
print( "%s 爱跑步" % self.name)
self.weight -= 1
P1=Person("小酥",60)
P2=Person("大桃",55)
P1.run()
print(P1)
P2.run()
print(P2)
运行结果为:
小酥 爱跑步
她是 小酥 体重为59.0 公斤 #保留一位小数
大桃 爱跑步
她是大桃 体重为54.0 公斤
上一个例子中如果不运行P2.run()
即Eg:
class Person:
def __init__(self,name,weight):
self.name=name
self.weight=weight
def __str__(self) :
return "她是 %s 体重为 %.1f 公斤" %(self.name,self.weight)
def run(self):
print( "%s 爱跑步" % self.name)
self.weight -= 1
P1=Person("小酥",60)
P2=Person("大桃",55)
P1.run()
print(P1)
P2()
运行结果为:
小酥 爱跑步
她是 小酥 体重为59.0 公斤
她是大桃 体重为55.0 公斤
#即她的体重没有发生变化