热门搜索 :
考研考公
您的当前位置:首页正文

面向对象是Python初学者必须学好的一个环节!神级程序员详解!

来源:东饰资讯网

二. 属性

在类中我们可以定义一些属性,比如:

定义了一个people类,里面定义了name和age属性,默认值分别为'jack'和12。在定义了类之后,就可以用来产生实例化对象了,这句p = people( )实例化了一个对象p,然后就可以通过p来读取属性了。这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加2个下划线 ' __'。

  这段程序运行会报错:

构造方法__init__(self,....):在生成对象时调用,可以用来进行一些初始化操作,不需要显示去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。

析构方法__del__(self):在释放对象时调用,支持重载,可以在里面进行一些释放资源的操作,不需要显示调用。

还有其他的一些内置方法,比如 __cmp__( ), __len( )__等。下面是常用的内置方法:

内置方法 说明

__init__(self,...)初始化对象,在创建新对象时调用

__del__(self)释放对象,在对象被删除之前调用

__new__(cls,*args,**kwd)实例的生成操作

__str__(self)在使用print语句时被调用

__getitem__(self,key)获取序列的索引key对应的值,等价于seq[key]

__len__(self)在调用内联函数len()时被调用

__cmp__(stc,dst)比较两个对象src和dst

__getattr__(s,name)获取属性的值

__setattr__(s,name,value)设置属性的值

__delattr__(s,name)删除name属性

__getattribute__() __getattribute__()功能与__getattr__()类似

__gt__(self,other)判断self对象是否大于other对象

__lt__(slef,other)判断self对象是否小于other对象

__ge__(slef,other)判断self对象是否大于或者等于other对象

__le__(slef,other)判断self对象是否小于或者等于other对象

__eq__(slef,other)判断self对象是否等于other对象

__call__(self,*args)把实例对象作为函数调用

 __init__():__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。代码例子:

 __new__():__new__()在__init__()之前被调用,用于生成实例对象。利用这个方法和类属性的特性可以实现设计模式中的单例模式。单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象。

Python不允许实例化的类访问私有数据,但你可以使用object._className__attrName访问这些私有属性。

  __getitem__():如果类把某个属性定义为序列,可以使用__getitem__()输出序列属性中的某个元素.假设水果店中销售多钟水果,可以通过__getitem__()方法获取水果店中的没种水果。代码例子:

__call__():在类中实现__call__()方法,可以在对象创建时直接返回__call__()的内容。使用该方法可以模拟静态方法。代码例子:

 在类外对类对象people进行实例化之后,产生了一个实例对象p,然后p.age = 12这句给p添加了一个实例属性age,赋值为12。这个实例属性是实例对象p所特有的,注意,类对象people并不拥有它(所以不能通过类对象来访问这个age属性)。当然还可以在实例化对象的时候给age赋值。

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

类方法还有一个用途就是可以对类属性进行修改:

实例方法:在类中最常定义的成员方法,它至少有一个参数并且必须以实例对象作为其第一个参数,一般以名为'self'的变量作为第一个参数(当然可以以其他名称的变量作为第一个参数)。在类外实例方法只能通过实例对象去调用,不能通过其他方式去调用。

静态方法:需要通过修饰器"@staticmethod"来进行修饰,静态方法不需要多定义参数。

六. 继承和多重继承

上面谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。

在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Python支持多继承,能够让一个子类有多个父类。

Python中类的继承定义基本形式如下:

此时有一个问题就是如果SubClass没有重新定义构造方法,它会自动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。如果SubClass重新定义了构造方法,需要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有重新定义构造方法,则只会执行第一个父类的构造方法。并且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。

 能够直接说明多态的两段示例代码如下:

1、方法多态

 就in_the_forest函数而言,参数对象是一个鸭子类型,它实现了方法多态。但是实际上我们知道,从严格的抽象来讲,Person类型和Duck完全风马牛不相及。

2、运算符多态

  上例中,显而易见,Python的加法运算符是”多态“的,理论上,我们实现的add方法支持任意支持加法的对象,但是我们不用关心两个参数x和y具体是什么类型。

Python同样支持运算符重载,实例如下:

Top