Python面向对象编程(Object Oriented Programming,OOP)之初识
引言
首先我们先来了解一些名词:类,对象,实例,实例化。
类:具有相同特征的一类事物,如人类,动物类,老虎等。
对象/实例:在类中具体的某个事物,如人类中的小明,动物类中的一只狗,老虎中的虎王等。
实例化,由类的特点具体引出某一个对象的过程,如结合人类的特点,构造出小明这个人。
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
面向对象设计:针对对象的特点,抽象出某些具有相似性质的一类事物构建类,针对类的实现和程序的需求按照流程来进行软件设计。
面向对象的核心思想:上帝思维(对象)
面向对象设计的优缺点:
优点:
- 极大降低了程序编写的复杂性,只需要顺着执行的步骤,按照设计思维堆叠代码即可。
- 解决了程序的可扩展性,对某一对象的单独修改,会立刻反映到整个体系中,如对游戏某个角色属性的修改较为容易。
缺点:
- 一套流水线或者就是用来解决一个问题,代码关联性高,可谓“牵一发而动全身”,后期维护难度较大需要考虑周全。
- 可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
面向对象的应用场景:
需求日常需要变化的程序,互联网应用,git,Apache HTTP Sever等
类(class)
语法:class 类名:
下面我们来定义一个类:
class Person: # 定义一个类
role = 'person' # 定义其中静态变量
def work(self): # 定义其中方法,也叫动态变量
print("人需要工作!")
print(Person.role) # 查看类中静态变量
print(Person.work(1)) # 引用类中走路方法,注意这不是调用,需要加个参数,随便写的1
结果:
person
人需要工作!
NoneProcess finished with exit code 0
分析:当程序执行到Person类时,在内存地址开辟一个空间,里面存放变量role、方法work和一些系统加载,并没有执行类。print(Person.role)打印Person类调用本类中的role变量,同理下一句Person.work(1)属于引用类中的方法,方法打印“人需要工作!”,引用结束后返回None,参数1是为了传参需要,在这里无实际意义。
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征。
下面参考实例化代码:
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人
def __init__(self, name):
self.name = name # 每一个角色都有自己的昵称;
def work(self): # 人都可以工作,也就是有一个工作方法
print("人可以工作")
print(Person.role) # 查看人的role属性
print(Person.work(1)) # 引用人的工作方法,注意,这里不是在调用
结果:
person
人可以工作
NoneProcess finished with exit code 0
self
在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做,因为你瞎改别人就不认识,这是一个通识。
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人
def __init__(hello, name):
hello.name = name # 每一个角色都有自己的昵称;
def work(hello): # 人都可以工作,也就是有一个工作方法
print("人可以工作")
print(Person.role) # 查看人的role属性
print(Person.work(1)) # 引用人的工作方法,注意,这里不是在调用
上述例子说明可以瞎改,我们希望您能够遵照大家的习惯。结果:
person
人可以工作
NoneProcess finished with exit code 0
实例化对象
语法:对象名 = 类名(参数1,参数2...)
实例化就是将具有特殊属性的一类具体到一个对象。如下:
class Person:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def do_one(self):
print("{},{}岁,{},上山去砍柴".format(self.name, self.age, self.sex))
def do_two(self):
print("{},{}岁,{},开车去东北".format(self.name, self.age, self.sex))
def do_three(self):
print("{},{}岁,{},最爱大保健".format(self.name, self.age, self.sex))
p1 = Person("小明", 10, "男")
p1.do_one()
p1.do_two()
p1.do_three()
p2 = Person("老李", 90, "男")
p2.do_one()
p2.do_two()
p2.do_three()
结果:
小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健
老李,90岁,男,上山去砍柴
老李,90岁,男,开车去东北
老李,90岁,男,最爱大保健Process finished with exit code 0
结论:
- 对象名 = 类名(参数1,参数2...):实例就是对象,代表着一个具体的东西,调用的结果返回一个对象;
- 对象名.静态变量:对象调用类中的静态变量;
- 对象名.方法():对象调用类中的方法。
类名称空间与对象名称空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性。
类具有两种属性:
- 静态属性,直接在类中定义的变量;
- 动态属性,类中的方法。
其中类的静态属性是共享给所有的对象的,而类的动态属性是绑定到所有对象的。
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性。
类实例化的对象查找类中的变量,现在本类中查找,若找不到则从其父类查找,父类找不到则继续往父类找...直到找到或者没找到,找到获取之,找不到抛出异常。
面试题
一、谈谈你对面向对象的理解?
参考答案:面向对象,首先我们要理解对象,什么是对象?对象是特征与技能的结合体。特征即变量,技能即函数,对象就是变量和函数的结合体,在python中既有面向对象编程, 也有面向过程编程,在所做项目中需要用到哪种更加便捷就用那种编程方式,学面向对象的人,正常最常听到的一句话就是“万物皆对象”,我们编程就是将现实中的事物, 抽象成程序中的对象,用特征和技能去表现出对象。
下一篇: ajax的问题
推荐阅读
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】
-
PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
-
荐 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)
-
python经典书籍推荐:Python面向对象编程指南 : Mastering Object-oriented
-
Python面向对象编程(Object Oriented Programming,OOP)之初识
-
荐 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)
-
python经典书籍推荐:Python面向对象编程指南 : Mastering Object-oriented