Python之面向对象(1)

知识框架:

1.面向过程vs面向对象

2.初识面向对象
      类的相关知识
      对象的相关知识
      面向对象相关介绍

3.面向对象的三大特性
      继承
      多态
      封装

4.面向对象的更多说明

      面向对象的软件开发
      几个概念的说明
      面向对象常用术语

面向过程VS面向对象

面向过程强调的是怎么做?

面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。把完成某一个需求的所有步骤从头到尾逐步实现,根据开发需求,将某些功能独立的代码,封装成一个又一个函数,最后完成的代码是:顺序调用不同的函数。

优点是:极大的降低了写程序的复杂度,注重步骤与过程不注重职责分工,只需要顺着要执行的步骤,堆叠代码即可。

缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身,如果需求复杂 代码会变得复杂,开发复杂项目没有固定的套路 开发难度大。

面向对象强调谁来做?

面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。相比较函数,面向对象是更大的封装,根据职责在一个对象中封装多个方法,在完成某一个需求之前,首先确定职责--要做的事情(方法)根据职责 确定不同的对象,在对象内部封装不同的方法,最后完成的代码 就是顺序的让不同的对象调用不同的方法。

优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。

缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。

初识类和对象

python中一切皆为对象

是具有相同特征或者行为的事物的一个统称,是抽象的不能直接使用。
   特征,被称为属性;
   行为,被称为方法;
   类的三要素: 类名 属性 方法
类名的确定,名词提炼法,分析整个业务流程出现的名词,通常就是找到的类,对对象的特征描述通常可以定义为属性,对象具有的行为通常可以定义成方法。对象由类创建出来的一个具体存在 可以直接使用。

举一个栗子:比如你现在有一个动物园,你想描述这个动物园,那么动物园里的每一种动物就是一个类,老虎、天鹅、鳄鱼、熊。他们都有相同的属性,比如身高体重出生时间和品种,还有各种动作,比如鳄鱼会游泳,天鹅会飞,老虎会跑,熊会吃。

但是这些老虎熊啥的都不是具体的某一只,而是一类动物。虽然他们都有身高体重,但是你却没有办法确定这个值是多少。如果这个时候给你一只具体的老虎,而你还没死,那你就能给他量量身高称称体重,这些数值是不是就变成具体的了?那么具体的这一只老虎就是一个具体的实例,也是一个对象。不止这一只,其实每一只具体的老虎都有自己的身高体重,那么每一只老虎都是老虎类的一个对象。

在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。

类的相关知识

类的声明

 
'''class 类名:    '类的文档字符串'    类体'''

#创建一个类
class Data:  
   pass
类的两种作用:属性引用和实例化
 

 属性引用(类名.属性)

#定义一个人类
class Person:
    # 人的角色属性都是人
    role = 'person'
    # 人都可以走路,也就是有一个走路方法
    def walk(self):  
        print("person is walking...")
#查看人的role属性
print(Person.role)
# 引用人的走路方法,注意,这里不是在调用
print(Person.walk) 
 

实例化:类名加括号就是实例化,会自动触发__init__函数的运行,
可以用它来为每个实例定制自己的特征 
       

class Person:
    # 人的角色属性都是人
    role = 'person'

    def __init__(self, name):
        # 每一个角色都有自己的昵称;
        self.name = name
    # 人都可以走路,也就是有一个走路方法
    def walk(self):  
        print("person is walking...")
 # 查看人的role属性
print(Person.role) 
# 引用人的走路方法,注意,这里不是在调用
print(Person.walk)  

实例化的过程就是类——>对象的过程

原本我们只有一个Person类,在这个过程中,产生了一个egg对象,有自己具体的名字、攻击力和生命值。

语法:对象名 = 类名(参数)

egg = Person('egon')  
#类名()就等于在执行Person.__init__()
#执行完__init__()就会返回一个对象。
这个对象类似一个字典,
存着属于这个人本身的一些属性和方法。

查看属性&调用方法

print(egg.name)     
#查看属性直接 对象名.属性名

print(egg.walk())
#调用方法,对象名.方法名()

关于self

Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上。后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了。

首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,建议不要改,因为别人看不懂

对象的相关知识

#定义一个人类
class Person:  
      role = 'person'  
    def __init__(self, name, aggressivity, life_value):
        self.name = name
        # 每一个角色都有自己的攻击力;
        self.aggressivity = aggressivity  
        # 每一个角色都有自己的生命值;
        self.life_value = life_value  
    def attack(self,dog):  
    # 人可以攻击狗,这里的狗也是一个对象。
   #人攻击狗,那么狗的生命值就会
   根据人的攻击力而下降
        dog.life_value -= self.aggressivity

对象是关于类而实际存在的一个例子,即实例

对象/实例只有一种作用:属性引用

egg = Person('egon', 10, 1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)

当然了,你也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,我们也管它叫动态属性。
引用动态属性并不是执行这个方法,要想调用方法和调用函数是一样的,都需要在后面加上括号。

print(egg.attack)

面向对象小结

class 类名:
    def __init__(self, 参数1, 参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self): pass

    def 方法名2(self): pass

对象名 = 类名(1, 2)  
#对象就是实例,代表一个具体的东西
# 类名():类名+括号就是实例化一个类,
相当于调用了__init__方法
# 括号里传参数,参数不需要传self,
其他与init中的形参一一对应
# 结果返回一个对象
对象名.对象的属性1 
#查看对象的属性,
直接用 对象名.属性名 即可
对象名.方法名()  
#调用类中的方法,
直接用 对象名.方法名() 即可

面向对象的相关介绍

初始化方法 _ _init_ _

当使用 类名() 创建对象的时候 会自动执行以下操作:
1.为对象 在内存中分配空间 -- 创建对象
2.为对象的属性设置初始值 ---初始化方法
这个初始化方法就是 __init__方法 是对象的内置方法 ,__init__ 是用来专门定义一个类 具有哪些属性的方法。

在初始化方法中 定义属性

在__init__ 方法内部使用 self.属性名=属性的初始值 ,就可以定义属性,定义属性以后 在使用类创建的对象都会拥有该属性。

class Cat:
    def __init__(self):
        print("这是一个初始化方法")
        #在初始化方法中 定义属性
        self.name = "猫"  
   #使用类名()创建对象的时候会自动调用
    初始化方法__init__
    def eat(self):
        print("%s爱吃鱼" % self.name)

tom = Cat()
print(tom.name)


使用参数设置属性初始值

在开发中 如果希望  创建对象的同时,就设置对象的属性,可以对__init__进行改造。
1. 把希望设置的属性值 定义成__init__ 方法的参数
2.方法内部使用 self.属性=形参 接受外部传递的参数
3.在创建对象时 使用 类名(属性1,属性2...)调用
 

class Cat:
    def __init__(self, new_name):
        # self.name="猫"#这个值是固定死的
        self.name = new_name
    def eat(self):
        print("%s爱吃鱼" % self.name)

tom = Cat("小花猫")
print(tom.name)
lazy_cat = Cat("爱吃鱼")
lazy_cat.eat()


_ _del_ _

当使用 类名()创建对象时 对象分配完空间后 自动调用 __init__ 方法,当一个对象从内存中销毁前 会自动调用 __del__ 方法。

_ _str_ _方法

在python中 使用print 输出对象变量 默认情况下 会输出这个变量 引用的对象
是由哪一类创建的对象 以及在内存中的地址(十六进制表示)。如果在开发中 希望 print 输出对象 变量时 能够打印 自定义的内容 可以使用__str__。
__str__ 必须返回一个字符串
 

class Cat:
    def __init__(self,new_name):
        self.name=new_name
        print("%s 来了"%self.name)
    def __del__(self):
        print("%s 我去了"%self.name)
    def __str__(self):
        #必须返回一个字符串
      return "love[%s]"%self.name
#tom 是一个全局变量
tom=Cat("Ahab")
print(tom)

文章首发自公众号【Ahab杂货铺】关注公众号技术分享第一时间送达!

猜你喜欢

转载自blog.csdn.net/sinat_34576567/article/details/83998218