Python-面向对象特征

面向对象编程简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。

class Person:
    # 类属性
    __privateCount = 1  #私有
    publicCount = 2     #公共
    
   def __init__(self,name,age):  
        #创建属性并给属性赋值
        self.name = name  
        self.age = age
        
    def readCount(self):
        print('%d 私有变量'%self.__privateCount)
        print('%d 公有变量'%self.publicCount)  
   
     
class Teacher(Person):
    def teach(self):
        print('老师教学生') 
        
        
class Student(Person):  
    # 重载构造方法
   def __ init __(self,name,idno):  
        self.name = name  
        self.idno = idno
        
    # 重载eat方法        
    def eat(self):
        self.__run()
        print('%s吃饭'%self.name)
        
    # 私有方法,外部无法调用    
     def __run(self):
        print('吃完饭跑步')  
        
1.类

类是抽象的模板,通过类实例化无数的对象。就相当于类是工厂里生产的模具,而对象则是模具下生产的商品。

类的声明:

通过class声明一个类,缩进表示一个类的作用域,类名通常是大写开头的单词。如果有继承的类,通过小括号中引用要继承的类。表示该类的继承,如果没有填写继承类,默认继承object类,这是所有类最终都会继承的类。

2.对象
#继承父类构造方法,必须传递父类构造方法中需要传递的参数
teacher = Teacher('王老师','42')

#输出:老师教学生---自己的方法
teacher.teach() 

#输出:吃饭 --- 继承父类方法
teacher.eat()

#输出:王老师 ---属性的访问
teacher.name

# age 属性销毁
del teacher.age

student = Student('张三','190614')

#输出:学生吃饭---重载
student.eat()

#输出:190614 ---属性的访问
student.idno
  • 对象(实例)属性:
    可以通过self或者对象进行创建和访问。在构造函数中self.name和self.age创建name属性和age属性。
    创建原则:如果属性不存在,就会创建属性,存在的话,就修改属性值。
    属性的创建和访问也可以使用内置函数进行:
    setattr(对象名,属性名,属性值)
    getattr(对象名,属性名)
  • 类属性(变量):
    直接在类中且在函数体外定义的变量,是类属性或者类变量。定义之后虽然这个变量属于类所有,但类的所有对象都可以访问到。
    注意:千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性
  • self 含义:
    在类内部方法中引用的self,表示的是对象而不是类。如方法声明中的第一参数self表示的是对对象的引用,其指向的也是对象的地址。
    也可以这样理解self:方法的调用,是通过对象来进行,可以把self,理解为把当前对象当成参数传递到方法内部,进行引用。通过self,在方法内部,访问对象的属性和方法。
    注意:类中的方法声明,第一个参数必须显示的引用self,调用时忽略该参数的传递。
  • 私有方法和属性的声明:
    通过双下划线__来声明,只允许这个类本身进行访问。例如Person类中的__privateCount属性就是私有属性,在该类中可以使用,引用时必须带有双下划线。在外部或者说别的类中,通过对象去引用这个私有变量(属性)会报错,找不到改变量(属性)。
3.继承

继承是面向对象的重要特征之一,通过继承可以实现方法和属性的重用。承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
如:Person类就是父类或者说基类,Teacher 和 Student 类就是子类或者说派生类。
父类的属性和方法都会被子类继承,在子类中可以直接进行使用。如:Teacher 类中,teacher对象可以直接使用eat()方法和name和age属性。

方法的重载:
在父类中继承下来的方法,可以同过重写,来进行改造满足自己的实际需求。这种方式叫做重载。
方法在调用时:如果子类中没有进行方法的重写就会调用父类的方法。重写之后,会直接调用重写后的方法。

注意:子类如果重写了构造函数,那么父类的构造函数失效,在父类构造函数中生成的属性也是失效的。如:Student类,Student中只有name和idno属性,而Teacher类继承了父类的name和age属性。

多重继承:继承多个父类,在类声明中,父类之间用逗号隔开(横向)
多层继承: C类继承自B类,B类继承自A类,以此类推,就是多层继承
4.多态

多态也是面向对象重要的特征之一。通过一个单独的例子,来理解多态。

class Person:
    def eat(self):
            print('吃饭')
            
class Teacher(Person):
    def eat(self):
        print('老师吃饭')
        
class Student(Person):
    def eat(self):
        print('学生吃饭')
        
class Me:
    def runEat(self,person):
        person.eat()
        

# 调用演示      
teacher = Teacher() 

student = Student()

me = Me()

# 输出:老师吃饭
me.runEat(teacher)

#输出:学生吃饭
me.runEat(student)

通过上面的例子可以看到,任何依赖Person 作为参数的函数或者方法都可以不加修改的正常运行,并调用各自类中的eat方法,这就是多态的特性。
无需知道传入的确切类型,由运行时决定,调用方只管调用,不管细节。对于Python这样的动态语言来说,则不一定需要传入Person类型。我们只需要保证传入的对象有一个eat()方法。
动态语言的“鸭子类型”:它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

注:其实我们我们可以把runEat方法的参数person,当成是一个变量,Python中的变量并没有限定其数据类型,都是在运行时决定的,我们只要保证person的实参,有run()方法即可。
与OC 面向对象多态的区别:OC的多态必须有继承关系,而且runEat方法的参数person必须指定数据类型Person,这样才可以形成多态。

由于继承关系,teacher 对象既属于Teacher 类也是属于Person 类的,可以通过isinstance(对象名,类名)来进行验证。

5.引用计数

Python的内存回收机制是通过引用计数来实现的。当对象的引用计数变为0时,它会被回收,但不是立即的,有解释器在适当的时机,将垃圾对象的占用的内存空间回收。

对象被创建时,引用计数为1。该对象每被引用一次引用计数都会加1。当对象的引用减少时,引用计数减1。引用计数为0时,对象释放。

单下划线、双下划线、头尾双下划线说明:

_count: 表示该变量是protected类型,只能在其本身和子类中访问调用。
__count: 表示该变量是private类型,只能在这个类本身中进行访问。
__ init __ :一般是系统保留定义的名字。

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

推荐阅读更多精彩内容