python比较之面向对象

Posted 和而同

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python比较之面向对象相关的知识,希望对你有一定的参考价值。

python是面向对象语言,因此它具有面向对象封装、继承、多态等特点。

简单了解下面向对象术语

类:具有相同属性和方法的对象的集合,对象是实例化后的类。

方法:类中定义的函数,使用def定义,同时参数里面默认要带上self

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

局部变量:定义在方法中的变量,只作用于当前实例的类。

实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

实例化:创建一个类的实例,类的具体对象。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。 

python中定义类格式如下:

class ClassName():

  def 方法名(self):

    pass

类名一般建议使用驼峰命名方式,即:每个单词首字母大写。

 1 class Person(object):
 2     name1 = admin   #name1类变量
 3     __age = 18   #私有变量,以__开头,私有属性在类外部无法直接进行访问
 4     def __init__(self,age,sex):  #age sex为实例变量
 5         self.name = self.name1
 6         self.age = age
 7         self.sex = sex
 8 
 9     def info(self):
10         print(你的名字是{0},年龄{1}岁,性别是{2}.format(self.name,self.age,self.sex))
11 
12 if __name__ == __main__:
13     p = Person(20,)
14     p.info()

python继承,允许同时继承多个父类,在调用方法时,先寻找子类如果没有则寻找父类从左到右,再从下到上找

 1 class Person():
 2     def __init__(self,name):
 3         self.name = name
 4 
 5     def show(self):
 6         print(你的名字是{0}.format(self.name))
 7 
 8     def aa(self):
 9         print(我是父类Person)
10 
11 class PA():
12     def __init__(self,name):
13         self.name = name
14 
15     def show(self):
16         print(PA:你的名字是{0}.format(self.name))
17 
18     def aa(self):
19         print(我是父类PA)
20 
21     def bb(self):
22         print(我是类PA中的bb方法)
23 
24 class PsersonA(Person):
25     def __init__(self,name,age):
26         Person.__init__(self,name)
27         self.age = age
28     #
29     # def show(self):
30     #     print(‘你的名字是{0},年龄{1}岁‘.format(self.name, self.age))
31 
32 class PsersonB(PA):
33     def __init__(self,name,sex):
34         super(PsersonB,self).__init__(name)
35         self.sex = sex
36 
37     def show(self):
38         print(你的名字是{0},性别是{1}.format(self.name, self.sex))
39 
40     def info(self):
41         print(我是类PsersonB)
42 
43 class C(PsersonA,PsersonB):
44     def __init__(self,name,age,sex):
45         PsersonA.__init__(self,name,age)
46         PsersonB.__init__(self, name, sex)
47 
48     def info(self):
49         print(我是子类C)
50 
51 
52 if __name__ == __main__:
53     p = C(ADMIN,20,)
54     p.info()  #子类与父类存在相同方法,优先使用子类
55     p.show()   #子类方法不存在,则从父类中寻找,顺序 从左到右,从下到上,就先寻找第一个父类,如果没有继续找第一个父类的父类,如果还没有找第二个父类
56     p.aa()   #方法aa,C类中没有,找第一个父类 PsersonA 中也没有,找 PsersonA 的父类 Person 有方法aa
57     p.bb()

类的专有方法:

__init__ : 构造函数,在生成对象时调用

__del__ : 析构函数,释放对象时使用

__call__: 函数调用,对象后面(),触发调用 

__str__:改变对象的字符串显示

__doc__:类的描述信息

 1 class P():
 2     ‘‘‘类描述信息嘀嗒‘‘‘
 3     def __init__(self):
 4         print(我是构造函数,在生成对象时时执行)
 5 
 6     def __del__(self):
 7         print(我是虚构函数,最后执行)
 8 
 9     def info(self):
10         print(个人信息)
11 
12     def __call__(self, *args, **kwargs):
13         print(对象后面(),触发调用)
14         self.info()
15 
16     def __str__(self):
17         return 改变对象字符串显示
18 
19 if __name__ == __main__:
20     obj = P()
21     print(obj())
22     print(obj.__doc__)
23     print(obj)
24         

在类中方法有普通方法、静态方法、特性方法、类方法等

 1 class P(object):    
 2     def info(self):
 3         print(我是普通方法)  
 4     
 5     @property   #加property装饰器,为特性方法,在调用函数时无需加()
 6     def info1(self): 
 7         print(我是特性方法)
 8     
 9     @staticmethod  #加staticmethod装饰器,为静态方法,可由类名直接调用
10     def info2():
11         print(我是静态方法)
12     
13     @classmethod    #加classmethod装饰器,为静态方法,属于类,可由类直接调用
14     def info3(cls):
15         print(我是类方法)
16  
17         
18 if __name__ == __main__:
19     obj = P()
20     obj.info()
21     obj.info1
22     P.info2()
23     P.info3()
24         

以上是关于python比较之面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python比较之面向对象

python之面向对象

python之面向对象初识

Python之面向对象与类

面向面试编程代码片段之GC

18.Python面向对象之:继承