Python中的类,类以大写字母开头定义,以便于和函数区分,例子如下
class Ball:
def setName(self,name):
self.name = name
def say(self):
print('名字是:%s' % self.name)
调用和结果:
>>> a = Ball()
>>> a.setName('足球')
>>> a.s
>>> a.say()
名字是:足球
如上代码所示,建立了一个Ball类,第一个方法是setName,有两个参数,第二个方法是say,有一个参数,在下面的调用中,setName只传了一个参数,say没有穿参数,这是为什么呢?
这就是Python面向对象的特点,可以说参数self用来传的是对象,setName里边传入的足球是传到了name里,self接收的值是a,self这个参数时每个方法都必须要带的。
关于__init__(前后各两个下划线)方法,__init__方法是一个非常重要的方法,类似于C++中的构造函数,把上面的例子改一下:
class Ball:
def __init__(self,name):
self.name = name
def say(self):
print('名字是:%s' % self.name)
调用和结果:
>>> a = Ball('足球')
>>> a.say()
名字是:足球
在创建实例a的时候就调用了__init__方法。
公有和私有:
既然有了类,那肯定就会有权限的问题,Python的公有私有并不像C++,JAVA那样的使用public和private等来定义,Python里只是在需要私有的方法或变量前加上两个下划线,即可变为私有,举例如下:
class Poetry:
__poetry = '苟利国家生死以,岂因祸福避趋之'
def nianshi(self):
return self.__poetry
调用和结果:
>>> p = Poetry()
>>> p.__poetry
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
p.__poetry
AttributeError: 'Poetry' object has no attribute '__poetry'
>>> p.nianshi()
'苟利国家生死以,岂因祸福避趋之'
如上可见,直接调用私有的成员会报错,需要内部调用方可访问。
其实Python里的私有是伪私有,使用两个下划线之后只是把成员变量重命名了而已,其实还是可以外部调用的,就上面的例子:
>>> p._Poetry__poetry
'苟利国家生死以,岂因祸福避趋之'
如使用这样的调用方法的话,是可以直接在外部访问的。
继承:
先举例子:
class Parent:
def a(self):
print('正在调用父类方法')
class Child(Parent):
pass
-------------------------------------------
>>> p = Parent()
>>> p.a()
正在调用父类方法
>>> c = Child()
>>> c.a()
正在调用父类方法
如上代码所示,类Child的父类是Parent,子类调用了父类的方法。当然,子类也可以自己定义方法,子类的属性和方法不能和父类的属性和方法同名,否则会在子类的调用中覆盖父类的属性和方法。
有一种特殊情况,父类里有__init__方法,子类也需要__init__方法,这个时候如果直接写的话子类会把父类的方法覆盖掉,这里解决的方法有两个,第一种叫未绑定的父类方法,这种方法就是在子类的__init__方法中先调用一下父类的__init__方法,比如上面的例子的Parent中加入有个方法__init__(self),在Child的__init__(self)方法中先调用一下Parent.__init__(self)即可。第二种方法叫做super()函数,可以直接在子类的__init__(self)方法中调用super().__init__()即可。
关于多重继承,只需要把需要继承的父类名都写到括号中就可以了就像 class Child(Father1,Father2,Father3,······)即可。
组合:
有纵向关系的可以使用继承,有横向关系的就需要到了组合,组合是指把类的实例化放到新的类中,例子如下:
class O2:
def __init__(self,o):
self.num = o
class N2:
def __init__(self,n):
self.num = n
class Air:
def __init__(self,o,n):
self.O2 = O2(o)
self.N2 = N2(n)
def print_air(self):
print('空气中有氧气 %d ,氮气 %d ' % (self.O2.num, self.N2.num))
---------------------------------------------------------------------------
>>> a = Air(20,78)
>>> a.print_air()
空气中有氧气 20 ,氮气 78