(三)python基础之:面向对象基础

一、面向对象

面向对象是一种符合人类思维的编程方法,现实世界就是由对象和对象构成的,所以我们可以用代码将现实世界映射到开发中。 每一个对象都有他自己的状态和行为,以汽车为例:

状态:油耗,颜色,轴距,速度,材质......

行为:启动,行使,加减速,刹车......

二、类

类是构建对象的状态和行为的模板,以汽车为例,类就是汽车的设计图或者骨架图,而实例则是根据设计图制造出来的实物,被称作为对象。

例如:宝马88系中 红色,蓝色,黑色等。

定义一个类:

def car (object):
pass
#所有的类都会继承object类,不知道填什么就填这个类

三、类的属性和方法

类中定义的函数叫类的方法,类方法与普通函数的区别在于,其第一个参数固定为self,表示实际使用时对应的实例本身,可以使用init方法将一些强制的属性绑定进去。

1:定义一个Student类

class Car(object):
 #由于类是模板,当创建实例时,可以使用__init__构造方法将强制的属性绑定进去,self参数指向实例本身
       def __init__(self,speed):
        #给car定义speed属性
        self.speed = speed
    #定义一个打印汽车速度的方法(函数)
    def run(self):
        print('现在速度为:',self.speed)
        return  self.speed

2:传入参数

#创建student的实例,并传入数据
baoma = Car(100)

3:访问对象的属性

class Car(object):
    # speed = 0       #共用的类属性
    def __init__(self,speed,):
        self.speed = speed
    def run(self):
        print('现在速度为:',self.speed)
        return  self.speed

#创建Car的实例,并传入数据      
baoma = Car(100)

#调用baoma对象的speed属性。
print(baoma.speed)

#调用baoma的打印速度方法:
baoma.run()

运行结果:

L:/python项目库/面向对象编程/面向对象.py

100
现在速度为: 100

进程已结束,退出代码0

4:类的封装

因为在Student类中已经含有对象的属性,所以没必要在外部重新定义新的函数访问,我们可以在Student类中定义函数,这样的就叫封装。封装的好处是可以在类中新增方法。

新增打印汽车型号的方法。
class Car(object):
    def __init__(self,name,speed,):
        self.speed = speed
        self.name = name
    def run(self):
        print('现在速度为:',self.speed)
        return  self.speed
    #新增根据速度打印汽车型号的方法。
    def car_xh(self):
        if self.speed > 300:
            print(self.name,':','超级跑车')
        elif self.speed > 200:
            print(self.name,':','豪华型轿车')
        else:
            print(self.name,':','经济型轿车')

#创建Car的实例,并传入数据 
baoma = Car('baoma_X1',100)

#调用查询汽车型号的方法
baoma.car_xh()

5:访问限制

现在定义的类,外部可以访问到类的属性,这样很不安全,而且外部可以直接更改Car类的速度属性。

class Car(object):
    def __init__(self,name,speed,):
        self.speed = speed
        self.name = name
    def run(self):
        print('现在速度为:',self.speed)
        return  self.speed

#创建Car的实例,并传入数据
baoma = Car('baoma_X1',100)

#外部访问baoma的型号和速度
print(baoma.name,baoma.speed)

#外部更改宝马X1的参数
baoma.name = 'new_baoma_X1'
baoma.speed = 120

#更改后,再访问baoma的型号和速度
print(baoma.name,baoma.speed)

运行结果:

baoma_X1 100

new_baoma_X1 120

进程已结束,退出代码0

如果要让类的属性不被外部访问,直接在类属性的名称前加“__”两个下划线,这样就变成了一个私有变量(private)

更改为私有变量之后
Traceback (most recent call last):
  File "L:/python项目库/面向对象编程/面向对象.py", line 26, in <module>
    print(baoma.name,baoma.speed)
AttributeError: 'Car' object has no attribute '__name'

这样就不能直接访问了,但是又想让外部访问和更改怎么办?而且还要对更改的参数做检查。

6:改进版访问限制

外部访问方法:get_name,get_speed
class Car(object):
    def __init__(self,name,speed,):
        self.__speed = speed
        self.__name = name
    def get_name(self):
        return self.__name
    def get_speed(self):
        return  self.__speed
    def run(self):
        print('现在速度为:',self.__speed)
        return  self.__speed

#创建Car的实例,并传入数据
baoma = Car('baoma_X1',100)

#外部访问baoma的型号和速度
print(baoma.get_name(),baoma.get_speed())

运行结果:

baoma_X1 100

进程已结束,退出代码0

外部更改speed的方法:set_speed,并检查参数不能小于0
class Car(object):
    def __init__(self,name,speed):
        self.__speed = speed
        self.__name = name
    def get_name(self):
        return self.__name
    def get_speed(self):
        return  self.__speed
    def set_speed(self,speed):
        if speed > 0:
            self.__speed = speed
        else:
            raise ValueError('speed Erro')
    def run(self):
        print('现在速度为:',self.__speed)
        return  self.__speed

#创建Car的实例,并传入数据

baoma = Car('baoma_X1',100)
#调用set_speed方法,并传入错误参数
baoma.set_speed(0)

#外部访问baoma的型号和速度
print(baoma.get_name(),baoma.get_speed())

运行结果:

Traceback (most recent call last):
  File "L:/python项目库/面向对象编程/面向对象.py", line 34, in <module>
    baoma.set_speed(0)
  File "L:/python项目库/面向对象编程/面向对象.py", line 18, in set_speed
    raise ValueError('speed Erro')
ValueError: speed Erro

四、多态和继承

1:继承

##继承
class Animal(object):
    def speak(self):
        print('Animal is speaking:')

#定义Dog类,从父类继承
class  Dog(Animal):
    pass
class Cat(Animal):
    pass
#定义dog对象并调用继承来的Animal类的speak方法
dog = Dog()
dog.speak()

dog对象什么都没有做就能拿到Animal的方法,因为他即是Dog的子类也是Animal的子类。

2:多态

# -*- coding: utf-8 -*-

###多态
class Animal(object):
    def speak(self):
        print('Animal is speaking:')

#定义Dog类,从父类继承
class  Dog(Animal):
   def speak(self):
        print('汪汪')

class Cat(Animal):
    def speak(self):
        print('喵喵')

#定义一个外部函数speak_twice,传入的参数只要是带speak方法的对象就执行。
def speak_twice(animal):
    animal.speak()
    animal.speak()

speak_twice(Animal())
speak_twice(Dog()) 

1:在写一个函数speak_twice时,要调用Animal类,只需要保证函数中speak方法编写正确,不管你想调用子类Dog还是父类Animal还是新的子类,都可以拿到父类的speak方法。 2:在1中,如果子类的方法名和父类重复时,子类的优先执行,所以父类的方法即可继承有可以重写。

开闭原则:

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

Python的鸭子理论

在Python中,只要你长得像鸭子那你就是鸭子 如: 在上面的多态例子中,函数speak_twice,只要你有speak方法那么就会执行,不管你的父类是谁

class yazi(object):
    def speak(self):
        print('嘎嘎')

speak_twice(yazi())

五、多重继承

继承和多态不仅可以继承父类的功能和行为,也可以继承多个父类,这样的叫多重继承。

# -*- coding: utf-8 -*-
"""
@author:leelian
@time:2018/9/2515:40
"""
class Bird(object):
    pass
class Mammal(object):
    pass
class Flyable(object):
    def say(self):
        print('我会飞!')
class Swimmable(object):
    def say(self):
        print('我会游泳')

#定义一种会飞的哺乳动物
class Bat(Flyable,Mammal):
    pass
#创建实例,并调用实例的方法
bat = Bat()
print(bat.say())

#如果多重继承中有多个父类,以第一个为主。
class Seagull(Mammal, Flyable, Swimmable):
    pass

#创建实例,并调用实例的方法)
seagull = Seagull()
seagull.say()

###类的定制__iter__
#构造一个迭代类
class FactorialIterator(object):
    def __init__(self):
        self.value = 1
        self.index = 1
    def __next__(self):
        self.value = self.value * self.index
        self.index = self.index + 1
        if self.index > 11:
                 raise  StopIteration()
        return self.value

class Factorial(object):
    def __init__(self):
        pass
    def __iter__(self):
        return FactorialIterator()

factorial = Factorial()
for n in factorial:
    print(n)

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

推荐阅读更多精彩内容