再次接触面向对象

    “面向对象”是专指在程序设计中采用封装、继承、抽象等设计方法。可是,这个定义显然不能再适合现在情况。面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。


给你一个任务,你要思考怎么做。

如果你的思维方式是:我先做什么,再做什么……这叫面向过程;

如果思维方式是:我先做一个什么东西来做这件事,再做一个什么东西来做那件事,然后它们怎么相互配合……这叫面向对象。

封装

    封装就是定义一个类,然后给该类的 属性(成员变量) 和方法加上访问控制,使得该类的属性和方法对于类外部来说,想可见的可见,不想可见的隐藏。所以,通过封装这个手段,就抽象出来了事物的本质特性。

    将对象敏感的数据,封装在类的内部,不让外界直接访问;而是通过定义的set/get方法来间接访问内部的数据的过程,此时,就可以在set/get方法中,添加条件限制代码!�正常变量,没有任何限制,想怎么访问怎么访问‚约定了以一个下划线开头的变量,是私有变量,外界不要直接使用,如_nameƒ两个下划线开头的属性,表示当前类的私有属性,外界不能访问__age

classPerson:

def__init__(self,heigh,name, age):

self.heigh = heigh

self._name = name

self.__age = age

defset_age(self, age):

ifage >=0andage <=100:

self.__age = age

else:

print("设置的年龄不合法...")

defget_age(self):

returnself.__age

def__str__(self):

return"姓名:%s;年龄:%s"% (self.__name,self.__age)

p = Person(175,"tom",12)

print(p.heigh)

print(p._name)可以输出,但不建议

print(p.__age)报错,会出现不存在__age的说法,应该应用一下用法:

p.set_age(1200)

print(p。Get_age)

对上面进行进一步的解释:

   所谓封装,就是将属性和方法捆绑到一起,封装到一个对象中去,简单的说,你是人,你有许多属性,比如说你的姓名,年龄,身高,体重,性别,性格,爱好等等,这是属性;而同时,你又会吃饭,睡觉,工作,学习,做事情,这些是方法,是你所具有的;同时将属性和方法封装到一个类中去,就能很完美的描述这个类的特征了,同时,它所具有的方法也就一起集成到类中,方便使用。

为什么要加上访问控制?

是,有些东西是很关键很机密的,不想随便被使用,被改变,被访问。

二是,可能这个东西不是很关键机密,访问和改变也无所谓,但是,因为有些属性和方法,它们对于外部来说,是无关的没用的,但是对于我自己这个类来说,是必要的,因为可能在我自己这个类中要使用它们,这个时候,进行隐藏,不让外部看,好处就是,如果将这些不必要的内容也暴露给外部的话,那么在使用的时候,使用者会被迷惑,因为这个东西对他没用,但是又可以调用,访问,而且他又不知道又没有用,但是如果进行隐藏,不给外部查看,那么就很清晰了,因为这样一来,只要是对外暴露的属性方法,都是有用的,你想一下,JDK的类库里面的那些类,比如String类,对外暴露的属性和方法,哪个是无用的?这也是一种良好的编程习惯和规范。


封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。(采自Java面试题)


继承

    继承是指一个对象直接使用另一对象的属性和方法。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。

    同类事物具有共同性,在同类事物中,每个事物又具有其特殊性。运用抽象的原则舍弃对象的特殊性,抽取其共同性,则得到一个适应于一批对象的类,这便是基类(父类),而把具有特殊性的类称为派生类(子类),派生类的对象拥有其基类的全部或部分属性与方法,称作派生类对基类的继承。语法层面上讲,继承就是派生类拥有父类的数据、方法,又添了点自己的东西,所谓子承父业,发扬光大。

父类:被继承的类,称为父类,也称为基类、超类,子类继承父类,父类还可以继承父类

子类:继承了父类的类,称为子类,也称为派生类

子类拥有父类的公共属性和公共方法,如下面代码:

classA:

defeat(self):

print("吃饭")

classB(A):

defplay(self):

print("游戏中...")

classC(B):

defsleep(self):

print("休息休息")

classD(C):

pass

d = D()

d.eat()代码中B拥有A的方法,C拥有A,B的方法,D拥有ABC的方法

d.play()即D继承了以上父类的所有方法

d.sleep()

一个子类,可以同时继承多个父类

多继承,反应了生活中表现的多个角色如下面代码:

#定义了一个基础类

classPerson(object):

def__init__(self):

self.name ="tom"

classStudent(Person):

defeat(self):

print("吃食堂....")

defrespect(self):

print("尊师重道")

classSon(Person):

defeat(self):

print("吃美食...")

deffealty(self):

print("尊老爱幼")

# User类型,继承了儿子类型、学生类型

#同时拥有儿子类型和学生类型中所有的公共属性和方法

classUser(Son,Student):

pass

#创建对象

u = User()

u.respect()# u是学生角色

u.fealty()# u是儿子角色

    对于吃饭这个方法,如果继承的多个父类中,出现了相同的属性和方法,就会执行方法或者属性的搜索过程,搜索到对应的属性和方法,立即执行,中断搜索所以尽量不要在多个类中出现名称相同的属性和方法

属性和方法的搜索过程,可以通过  类型.__mro__魔法属性进行查看,

基本原则是:优先继承,优先执行

u.eat()#即执行son的角色

print(User.__mro__)# method from object

方法重写:子类中,重新定义父类中已经存在的方法    子类-父类,两个实现了继承关系的类型,才会有方法重写如果方法进行了重写,在子类对象执行这个方法时,优先执行重写的方法。如果子类没有重写这个方法,在执行时就会执行从父类中继承过来的方法

classPerson:

defeat(self,food):

print("吃饭吃饭..饿肚肚..吃%s"% food)

classMan(Person):

defeat(self,food):

print(">>>>>>>>>>饿肚肚,吃饭饭,吃%s"% food)

p = Person()

p.eat("鱼香肉丝")

m = Man()

m.eat("烤全羊")#优先执行自身的方法的代码


方法重载:在一个类型中,出现了相同名称,不同参数的函数/方法,称为方法重载

    目的:在执行的过程中,通过参数的不同,来执行不同的代码,实现不同的功能

python中,已经实现了,【可变参数、关键字参数】--【我不需要方法重载了!】

python又针对属性访问函数,进行了相同名称函数的定义 —— 伪方法重载

伪方法重载的目的:配合封装,隐藏数据访问方法的底层实现!

在下面代码讲解

classUser:

def__init__(self,name):

self.__name = name

@property

defname(self):

returnself.__name

@name.setter#旁边执行了两个name方法,即叫做(伪)方法重载

defname(self,n):

self.__name = n

u = User("tom")

u.name ="jerry"#数据访问方法被隐藏了,方法当成了属性来进行执行

print(u.name)#数据访问方法被隐藏了,方法当成了属性来进行执行


多态

多态:程序在运行的过程中,根据执行条件的不同,动态执行不同的操作代码的过程称为程序运行时多态。请看一下程序

#定义一个人的类型

classPerson:

# name姓名age年龄health健康值【0~50极度虚弱,51~70亚健康,71~85健康,86~100强壮】

def__init__(self,name,age,health):

self.name = name

self.age = age

self.health = health

#康复的方法

defrecure(self):

print("[%s]康复了,当前健康值%s"% (self.name,self.health))

classMan(Person):

def__init__(self,name,age,health):

Person.__init__(self,name,age,health)

defrecure(self):

print("%s哇咔咔,康复了"%self.name)

classWomen(Person):

def__init__(self,name,age,health):

Person.__init__(self,name,age,health)

defrecure(self):

print("[%s]死鬼,终于康复了..."%self.name)

classAnimal:

# name姓名age年龄health健康值【0~50极度虚弱,51~70亚健康,71~85健康,86~100强壮】

def__init__(self,name,age,health):

self.name = name

self.age = age

self.health = health

#康复的方法

defrecure(self):

print("[%s]嘿嘿嘿,终于康复了,当前健康值%s"% (self.name,self.health))

#定义人民医院

classHospital:

def__init__(self):

self.name ="人民医院"

defcare(self,person):

#类型判断,判断变量person是否Person类型

ifisinstance(person,Person):

ifperson.health >0andperson.health <=50:

print("手术......")

person.health +=30

person.recure()

elifperson.health >50andperson.health <=70:

print("输液......")

person.health +=15

person.recure()

else:

print("健康")

else:

print("不好意思,请出门左转,哪里是兽医院")

#医院对象

hospital = Hospital()

#生病的人

old_wang = Person("王先生",58,30)

mrs_li = Women("李夫人",28,56)

mr_li = Man("李先生",30,60)

#在这里,hospital由于对象的不同执行不同的

代码动态执行不同的操作代码的过程称为程序运行时多态

hospital.care(mrs_li)

#调用了治疗的方法

hospital.care(old_wang)

hospital.care(mr_li)

a = Animal("tom",22,10)

hospital.care(a)


执行结果:

手术......

[王先生]康复了,当前健康值60

输液......

[李夫人]死鬼,终于康复了...

输液......

李先生哇咔咔,康复了

不好意思,请出门左转,哪里是兽医院

Process finished with exit code 0


再来一个例子:

classMan:

defintro(self):

print("我的姓名是XXXXXXXXXXXXXXXXXXXXXX")

classWomen:

defintro(self):

print("我的姓名是oooooooooooooooooooooo")

defintroduction(person):

person.intro()

m = Man()

w = Women()

introduction(m)#由于m和w的不同,函数执行两个不同代码,这个过程就可以

introduction(w)#称之为多态

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,256评论 1 6
  • 面向对象的编程思想的发展历程 我理解的面向过程与面向对象 自从学习python以来,以前所接触的代码是根据实际的案...
    卢子野阅读 3,046评论 0 0
  • 1.1面向对象 面向对象(object-oriented ;简称: OO)至今还没有统一的概念 我这里把它定义为:...
    TENG书阅读 563评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 北七海阅读 100评论 0 0