python面向对象编程语言

面向对象的编程语言简单来说就是基于对类和对象的使用,所有的代码都是通过类和对象实现的编程语言。

面向对象的三大特性:继承、封装、多态。

创建一个类:

#使用class创建一个School类,类中有个student方法

class School:

    def student(self):

        passa1=School()

一、封装

1.封装:将某些内容先封装到一个地方,等到需要的时候再去调用。

class School:

    def __init__(self,name,age):    #构造方法,创建对象时执行

        self.name=name

        self.age=age

#创建对象a1,a2

a1=School("zhangsan",18)

a2=School("lisi",18)

上面的内容就是实现封装的功能,把各自的姓名和年龄封装到了self的name和age中,就等于被封装到了对象a1和a2中。

类中定义的函数叫方法,__init__的函数叫构造方法,在创建a1和a2时创建。

2.调用:调用有两种方式调用,通过self间接调用和通过对象直接调用。

#通过对象直接调用

class School:

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def student(self):

        print("name:%s,age:%s"%(self.name,self.age))

#创建对象a1,a2

a1=School("zhangsan",18)

a2=School("lisi",18)

print a1.name,a1.age

print a2.name,a2.age

#执行结果: 

zhangsan 18

lisi 18

#通过self间接调用

class School:

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def student(self):

        print("name:%s,age:%s"%(self.name,self.age))

#创建对象a1,a2

a1=School("zhangsan",18)

a2=School("lisi",18)

#执行类中的方法时,通过self间接调用被封装的内容

a1.student()

a2.student()

#执行结果:

name:zhangsan,age:18

name:lisi,age:18

二、继承

1、继承:派生类(子类)可以继承基类(父类)的方法,我们可以将多个类共有的方法提取到父类中,这样子类只需继承父类而不必实现每个方法。在类名后面括号中写上另一个类,表示继承了那个类

#ex45.py

#使用class创建一个School类

class School:

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def student(self):

        print("name:%s,age:%s"%(self.name,self.age))

    def classroom(self):

        print("%s去教室"%self.name)

class SchoolA(School):  #SchoolA继承School

    def __init__(self,name):

        self.name=name

class SchoolB(SchoolA): #SchoolB继承SchoolA

    def __init__(self,name):

        self.name=name

#创建对象a1

a1=SchoolA("zhangsan")

a1.classroom()

#创建对象a2

a2=SchoolB("lisi")

a2.classroom()

输出:

zhangsan去教室

lisi去教室

2.多继承

在python中类可以继承多个类,在继承多个类时,他对类中的函数查找有两种方式。

深度优先:类是经典类时,多继承情况下,会按照深度优先方式查找。

广度优先:类是新式类时,多继承情况下,会按照广度优先方式查找

python3.X下都是广度优先

class A():

    def name(self):

        print("AAAAAA")

class B(A):

    pass

class C(A):

    def name(self):

        print("CCCCCC")

class D(B,C):

    pass

a1=D()

a1.name()  #输出:CCCCCC

三、多态

python不支持多态,也用不到多态。

四、类中的成员

类中的成员:字段、方法、属性

1、字段

字段:普通字段、静态字段

class School:

    headmaster="王五"

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def student(self):

        print("name:%s,age:%s"%(self.name,self.age))

#创建对象a1

a1=School("zhangsan",18)

print(a1.name)  #访问普通字段

print(School.headmaster)    #访问静态字段

#执行结果:

#  zhangsan

#  王五

在上面代码中,__init__函数中的就是普通字段,headmaster就是静态字段

普通字段:属于对象,由对象来访问,在内存中每个对象都要保存一份

静态字段:属于类,由类直接访问,在内存中只保存一份

2、方法

方法:普通方法、静态方法、类方法

class School:

    headmaster="王五"

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def student(self):  #普通方法 至少一个self

        print("普通方法")

    @staticmethod      #静态方法 任意参数

    def classroom():

        print("静态方法")

    @classmethod

    def dormitory(cls):    #类方法 只能一个cls

        print("类方法",cls)

#创建对象a1

a1=School("zhangsan",18)

a1.student()

School.classroom()    #访问静态方法

School.dormitory()    #访问类方法

输出:

普通方法

静态方法

类方法 <class '__main__.School'>

普通方法:先创建一个对象,在用对象去调用这个方法

静态方法:直接用类调用,可以有任意参数(静态方法可以让类直接调用,省去了普通方法创建对象的步骤)

类方法:直接用类调用,只能一个cls参数

    上面我们可以看到执行类方法时,输出了他传入的参数等于<class '__main__.School'>,是一个类,意思就是执行时,它会把当前的类当成参数传进去。

3、属性

属性定义:装饰器定义、静态字段定义

(1)装饰器定义

class School:

    headmaster="王五"

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def student(self):  #方法

        print("方法")

    @property

    def classroom(self):    #属性,加上@property装饰器,仅有一个self参数

        print("属性")

#创建对象a1

a1=School("zhangsan",18)

a1.student()    #调用方法

a1.classroom    #调用属性

输出:

方法

属性

在上面代码中可以看到,在方法上加上@property装饰器就叫属性,属性和方法的区别就是调用时不用加括号

在新式类中,除了@property,还有另外两种装饰器

class School(object):

    def __init__(self,name,age):

        self.name=name

        self.age=age

    @property

    def classroom(self):    #属性,加上@property装饰器,仅有一个self参数

        print(self.name,self.age)

    @classroom.setter

    def classroom(self,age):

        self.age=age    #把age修改为传入的参数

        print("修改",self.name,self.age)

    @classroom.deleter

    def classroom(self):

        del self.age        #删除age

        print("删除",self.name,self.age)

#创建对象a1

class School(object):

    def __init__(self,name,age):

        self.name=name

        self.age=age

    @property

    def classroom(self):    #属性,加上@property装饰器,仅有一个self参数

        print(self.name,self.age)

    @classroom.setter

    def classroom(self,age):

        self.age=age    #把age修改为传入的参数

        print("修改",self.name,self.age)

    @classroom.deleter

    def classroom(self,age,name):

        del self.age        #删除age

        print("删除",self.name,self.age)

#创建对象a1

a1=School("张三",18)

a1.classroom    #1.执行后会自动调用@property方法

a1.classroom=20    #2.执行后会自动调用@classroom.setter的方法,并将20传给age参数

a1.classroom  #3.执行后会自动调用@classroom.deleter的方法

输出:

张三 18

修改 张三 20

张三 20

(2)静态字段定义

class School(object):

    def __init__(self,name,age):

        self.name=name

        self.age=age

    def classroom(self):

        print(self.name,self.age)

    def classroom_update(self,age):

        self.age=age    #把age修改为传入的参数

        print("修改",self.name,self.age)

    def classroom_del(self):

        del self.age        #删除age

        print("删除",self.name,self.age)

    obj=property(classroom,classroom_update,classroom_del)  #静态字段方式定义属性

#创建对象a1

a1=School("张三",18)

a1.obj  #1.执行后会自动调用classroom方法

a1.obj=20    #2.执行后会自动调用classroom_update的方法,并将20传给age参数

del a1.obj    #3.执行后

输出:

张三 18

修改 张三 20

张三 20

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

推荐阅读更多精彩内容