Python的学习笔记DAY5---面向对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mx_windxiao/article/details/52844256

        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




猜你喜欢

转载自blog.csdn.net/mx_windxiao/article/details/52844256