Python3面向对象二

ios开发求职招聘微信群 http://liangssw.com/bozhu/13282.html

接上篇内容

7.继承

Python同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。派生类的定义如下所示:

classDerivedClassName(BaseClassName):statement-1...statement-N

子类(派生类DerivedClassName)会继承父类(基类BaseClassName)的属性和方法。

BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:

classDerivedClassName(modname.BaseClassName):

#!/usr/bin/python#类定义classpeople:#定义基本属性name=age=0#定义私有属性,私有属性在类外部无法直接进行访问__weight=0#定义构造方法def__init__(self,n,a,w):self.name=nself.age=aself.__weight=wdefspeak(self):print("%s说:我%d岁。"%(self.name,self.age))#单继承示例classstudent(people):grade=def__init__(self,n,a,w,g):#调用父类的构函people.__init__(self,n,a,w)self.grade=g#覆写父类的方法defspeak(self):print("%s说:我%d岁了,我在读%d年级"%(self.name,self.age,self.grade))s=student(ken,10,60,)s.speak()

执行以上程序输出结果为:

ken说:我10岁了,我在读年级8.多继承

Python同样有限的支持多继承形式。多继承的类定义形如下例:

classDerivedClassName(Base1,Base2,Base):statement-1...statement-N

需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索即方法在子类中未找到时,从左到右查找父类中是否包含方法。

#!/usr/bin/python#类定义classpeople:#定义基本属性name=age=0#定义私有属性,私有属性在类外部无法直接进行访问__weight=0#定义构造方法def__init__(self,n,a,w):self.name=nself.age=aself.__weight=wdefspeak(self):print("%s说:我%d岁。"%(self.name,self.age))#单继承示例classstudent(people):grade=def__init__(self,n,a,w,g):#调用父类的构函people.__init__(self,n,a,w)self.grade=g#覆写父类的方法defspeak(self):print("%s说:我%d岁了,我在读%d年级"%(self.name,self.age,self.grade))#另一个类,多重继承之前的准备classspeaker():topic=name=def__init__(self,n,t):self.name=nself.topic=tdefspeak(self):print("我叫%s,我是一个演说家,我演讲的主题是%s"%(self.name,self.topic))#多重继承classsample(speaker,student):a=def__init__(self,n,a,w,g,t):student.__init__(self,n,a,w,g)speaker.__init__(self,n,t)test=sample("Tim",25,80,4,"Python")test.speak()#方法名同,默认调用的是在括号中排前地父类的方法

执行以上程序输出结果为:

我叫Tim,我是一个演说家,我演讲的主题是Python9.方法重写

如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:

#!/usr/bin/pythonclassParent:#定义父类defmyMethod(self):print(调用父类方法)classChild(Parent):#定义子类defmyMethod(self):print(调用子类方法)c=Child()#子类实例c.myMethod()#子类调用重写方法super(Child,c).myMethod()#用子类对象调用父类已被覆盖的方法

super()函数是用于调用父类(超类)的一个方法。

执行以上程序输出结果为:

调用子类方法调用父类方法10.类属性与方法10.1类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。

10.2类的方法

在类的内部,使用def关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数,self代表的是类的实例。

self的名字并不是规定死的,也可以使用this,但是最好还是按照约定使用self。

10.类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用,不能在类的外部调用。self.__private_methods。

类的私有属性实例如下:

#!/usr/bin/pythonclassJustCounter:__secretCount=0#私有变量publicCount=0#公开变量defcount(self):self.__secretCount+=1self.publicCount+=1print(self.__secretCount)counter=JustCounter()counter.count()counter.count()print(counter.publicCount)print(counter.__secretCount)#报错,实例不能访问私有变量

执行以上程序输出结果为:

Traceback(mostrecentcalllast):File"test.py",line16,inmoduleprint(counter.__secretCount)#报错,实例不能访问私有变量AttributeError:JustCounterobjecthasnoattribute__secretCount

类的私有方法实例如下:

#!/usr/bin/pythonclassSite:def__init__(self,name,url):self.name=name#publicself.__url=url#privatedefwho(self):print(name:,self.name)print(url:,self.__url)def__foo(self):#私有方法print(这是私有方法)deffoo(self):#公共方法print(这是公共方法)self.__foo()x=Site(菜鸟教程,



转载请注明地址:http://www.sanbaicaoasb.com/scls/8431.html
  • 上一篇文章:
  • 下一篇文章:
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章