Python3 面向对象(类和实例)

面向对象基础知识

面向对象程序设计(Object Oriented  Programming,OOP)是一种程序设计范型,也是一种程序开发方法。对象指的是类的实例类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫作类的实例化。面向对象程序设计将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

面向对象编程中的主要概念如下:

类(class)定义了一件事物的抽象特点。通常来说,类定义了事物的属性和它可以做到的行为。举例,一个动物拥有什么特征(名字等)和行为(叫或跑等),抽象出来一个动物类。一个类中可以有成员函数和成员变量,成员函数称为方法;成员变量称为属性。

对象(object):是类的实例。例如一个小狗是一个动物类的实例。当一个类被实例化时,它的属性就有了具体的值。每个类可以有若干个被实例化的对象。在操作系统中,系统给对象分配内存空间(疑问:操作系统咋知道类的?没有对象难道就不分配内存了吗?),而不会给类分配内存空间。

继承(inheritance):指通过一个已有的类(父类)定义另外一个类(子类),子类共享父类开放的属性和方法(父类可能有私有属性和方法)子类的对象不仅是子类的一个实例,而且是其父类的一个实例。例如,狗科子类继承动物父类,哈巴狗是狗科子类的实例,也是动物父类的实例。

封装性(Encapsulation):指类在定义时可以将不能或不需要其他类知道的成员定义成私有成员,而只公开其他类需要使用的成员,以达到信息隐蔽和简化的作用

多态性(Polymorphism):指同一方法作用于不同的对象,可以有不同的解释,产生不同的执行结果。在具体实现方式上,多态性是允许开发者将父对象的变量设置为对子对象的引用,赋值之后,父对象变量就可以根据当前的赋值给它的子对象的特性以不同的方式运作。

随着面向对象编程的普及,面向对象设计(Object Oriented Design,OOD)也日臻成熟,形成了以UML(Unified Modeling Language)为代表的标准建模语言。UML是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供了模型化和可视化支持,包括由需求分析到规格,再到构造和配置的所有阶段。

Python3中类和对象

1) 构造函数是一种特殊的类成员方法,主要用来在创建对象时初始化对象,即为对象成员变量赋初始值。Python中的类构造函数用__init__命名

注意:在构造函数中不能有返回值。__init__方法的第一个参数永远是self,表示创建的实例本身,因此会把各种属性绑定到self。

有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。

2) 析构函数是构造函数的反向函数,在销毁(释放)对象时将调用它们。析构函数往往用来做“清理善后” 的工作,例如数据库链接对象可以在析构函数中释放对数据库资源的占用。Python中为类定义析构函数的方法是在类中定义一个名为__del__的没有返回值和参数的函数。

与Java类似,Python解释器的堆中储存着正在运行的应用程序所建立的所有对象,但是它们不需要程序代码来显式地释放,因为Python解释器会自动跟踪它们的引用计数,并自动销毁(同时调用析构函数)已经没有被任何变量引用的对象。同时,Python提供了显式销毁对象的方法:使用del关键字。

3) 实例成员变量: 类中的成员变量,即类及其相应对象共享该成员变量。那么如何定义属于每个对象自己的成员变量呢?答案是在构造函数__init__中定义self引用中的变量,即实例成员变量。

class dog_class(object):

    def __init__(self, name )

        self.name=name

4) 静态函数和类函数:以上能通过对象访问而不能通过类名访问。Python中支持两种基于类名访问成员的函数:静态函数和类函数,它们的不同点是类函数有一个隐性参数 cls 可以用来获取类信息,而静态函数没有该参数。静态函数使用装饰器@staticmethod定义,类函数使用装饰器@classmethod定义。

5) 私有成员:封装性是面向对象编程的重要特点,Python也提供了不希望外部看到的成员隐藏起来的私有成员机制。但不像大多数编程语言用Public、Private关键字表达可见范围的方法,Python使用指定变量名格式的方法定义私有成员,即以双下画线“__”开始命名的成员都为私有成员。

6) 类和对象的基本使用方法

6.1) 类的函数

object=class()

object.function()

6.2) 类的成员变量

class.var_name

7) 获取对象信息

判断对象类型,使用type()函数。

判断class的类型,使用isinstance()函数。

获得一个对象的所有属性和方法,使用dir()函数,返回一个包含字符串的list。

仅仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态。

obj = MyObject()

>>> hasattr(obj, 'x')  # 有属性'x'吗?

True

>>> hasattr(obj, 'y') # 有属性'y'吗?

False

>>> setattr(obj, 'y', 19) # 设置一个属性'y'

if hasattr(fp, 'read'):

        return readData(fp)

假设我们希望从文件流fp中读取图像,我们首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取。hasattr()就派上了用场。

请注意,在Python这类动态语言中,根据鸭子类型,有read()方法,不代表该fp对象就是一个文件流,它也可能是网络流,也可能是内存中的一个字节流,但只要read()方法返回的是有效的图像数据,就不影响读取图像的功能。

继承

类之间的继承是面向对象设计的重要方法,通过继承可以达到简化代码和优化设计模式的目的。Python类在定义时可以在小括号中指定基类,所有Python类都是object类型的子类。

class dog_class(object):

    def __init__(self, name )

        self.name=name

    def voice(dog_type):

        print (dog_type + "voice" )


class dog_type(dog_class):

    def run():

        print ("i can run")

当子类继承了多个父类,并且调用一个在几个父类中共有的成员函数时,Python解释器会选择距离子类最近的一个基类的成员方法。

注意:设计多父类的继承关系时,要尽量避免多个父类中出现同名成员。如果不可避免,则应当留意子类定义中引用父类的顺序。即class dog_type(dog_class, class),两个父类中不能出现同名成员。

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

推荐阅读更多精彩内容