-
# coding: utf-8
-
-
u'''类的继承、重载
-
-
类的继承:
-
1.新类可以继承父类的公有属性和公有方法。在类的内部方法中调用变量,需以"self.变量名"的方式来调用。self指类本身的属性、方法等。
-
2.类的私有属性命名,以'__'开头,如__var;类的私有属性不能在类的外部被使用或者访问,当然也不能修改,若要修改类的私有属性或者获取其值,可以通过使用类提供的方法来完成。在类的内部的方法中使用类的私有属性,必须以“self.私有属性名”的方式调用,如self.__var。
-
3.类的私有方法命名,也以'__'开头,如__show()。类的私有方法只能在类的内部进行调用,也必须以“self.私有方法名”的形式进行调用。
-
4.类的专有方法,以两条下划线开始并且以两条下划线结束,如__init__(),在类的实例化时将调用__init__()方法,常用__init__()方法为对象的属性进行初始化赋初值。
-
4.类中定义函数,必须含有第一个参数self,如def show(self)。
-
5.类实例化成对象时,所需参数个数,见类的初始化函数__init__()所定义的参数个数。若继承的子类中没有定义初始化函数__init__(),则其所需参数个数与父类中的__init()参数个数一致。
-
6.使用多重继承,需要注意父类名字的顺序。如果父类中有相同名字的方法名,而在子类中使用时未指定父类名,则python解释器将从左至右搜索,调用最先遇到的父类的方法。
-
7.如果父类定义了__init__方法,则子类必须显示地调用父类的__init__方法(若父类没有定义__init__,则不用),如果子类需要扩展父类的行为,可以添加__init__方法的参数。
-
8.__init__()方法,主要用于初始化类中的属性,以将属性供给类中的方法使用。
-
-
类的重载:(重载也是继承,通过继承的子类,其父类的方法不一定能满足类的需要,新类实际上只是修改了部分功能,为了避免命名函数的麻烦,进行方法重载。)
-
1.重载允许通过继承而创建的类重新定义父类的方法。不仅可以重载方法,而且还可以重载运算符,以适用自创建的类。
-
2.函数的重载是指多个函数的名称以及返回值类型均相同,仅参数类型或参数个数不同。函数重载大大提高了代码重用率和程序员开发效率。
-
3.python中函数参数变量是没有类型的,当你调用传值的时候才知道它到底是什么类型的变量。故对参数类型不同的函数根本无需考虑重载。
-
4.重载的一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载. 如果两个函数的功能不同,那么不应当使用重载,而应当使用一个名字不同的函数。
-
'''
-
-
# 1.类的继承:
-
class book: # 定义book类
-
"""docstring for ClassName"""
-
__author = '' # 定义类的私有属性
-
__name = ''
-
__page = 0
-
price = 0 # 类的公有属性
-
__press = ''
-
-
def __check(self, item): # 定义__check私有方法
-
if item == '':
-
return 0
-
else:
-
return 1
-
-
def show(self):
-
if self.__check(self.__author):
-
print self.__author
-
else:
-
print 'no value'
-
-
if self.__check(self.__name):
-
print self.__name
-
else:
-
print 'NO VALUE'
-
-
def setname(self, name):
-
self.__name = name
-
-
def __init__(self, author, name): # 使用__init__方法,为类的__author及__name赋初值。
-
self.__author = author
-
self.__name = name
-
-
class student(book): # 继承book类,来创建student类。新类可以继承父类的公有属性和公有方法。
-
"""docstring for ClassName"""
-
__class = ''
-
__grade = 0
-
__sname = ''
-
-
def showinfo(self): # 定义一个新的showinfo方法
-
self.show() # 此处仅调用book类中的show方法。也可以写成book.show(self)
-
#book.show(self) # 此处仅调用book类中的show方法
-
-
-
def main():
-
a = student('Jack', 'Big Book') # student类继承了book类的__init__方法且student类没有定义__init__方法,故所需参数见父类的__init__需要3个参数(包括默认的不显示的self参数)。
-
a.showinfo() # 调用student类中的showinfo方法
-
print '1,========='
-
a.show() # 调用book类中的show方法
-
#a.__class # 错误!类的私有属性不能在类的外部被调用。同样,在类的外部调用book.__check()也是错误的。
-
-
a = student('','')
-
a.showinfo()
-
print '2,========='
-
a.show()
-
-
if __name__ == '__main__':
-
main()
-
-
-
-
# 2.类的多重继承:
-
-
class A:
-
namea = 'A'
-
__num = 1
-
-
def show(self):
-
print self.namea #在类的内部调用属性都以 "self.属性名"方式来调用。
-
print self.__num
-
-
def setnum(self, num):
-
self.__num = num
-
-
class B:
-
nameb = 'B'
-
__num = 2
-
-
def show(self):
-
print self.nameb
-
print self.__num
-
-
def setname(self, name):
-
self.nameb = name # 类中的self指类本身中的属性和方法等。
-
-
class C(A, B):
-
def showall(self):
-
print self.namea
-
print self.nameb
-
#print self.__num #错误!__num为私有属性,不可继承!
-
show = B.show #指定show方法为B类的show方法。AB类中都有同名show方法,若不指定,则解释器从左至右搜索,去最先搜索到的同名show方法。
-
-
c = C() # 实例化C类成c对象
-
c.showall()
-
-
c.show() # 此处调用的A的show(),因为没有指定
-
-
c.setname(3) #
-
c.show()
-
-
-
# 3.类的重载:
-
-
# __init__方法的重载
-
class human:
-
__age = 0
-
__sex = ''
-
__height = 0
-
__weight = 0
-
name = ''
-
-
def __init__(self, age ,sex, height, weight): # 重载__init__方法
-
self.__age = age
-
self.__sex = sex
-
self.__height = height
-
self.__weight = weight
-
-
def setname(self, name):
-
self.name = name
-
-
def show(self):
-
print self.name # 类中的公有属性也用self调用。
-
print self.__age
-
print self.__sex
-
print self.__height
-
print self.__weight
-
-
class student(human):
-
__classes = 0
-
__grade = 0
-
__num = 0
-
-
def __init__(self, classes, grade, num, age, sex, height, weight): # 重载__init__方法
-
self.__classes = classes
-
self.__grade = grade
-
self.__num = num
-
human.__init__(self, age, sex, height, weight) # 调用human类的__init__方法初始化human类的属性.
-
-
def show(self): # 重载show方法
-
human.show(self) # 调用human类的show方法
-
print self.__classes
-
print self.__grade
-
print self.__num
-
-
a = student(12,3,20140901,25,'male',170,55) # 实例化生成a对象,参数个数与student类的__init__方法的参数个数一致。
-
a.setname('Tom') # 调用父类human中的setname方法
-
a.show() # 调用子类student中的show方法,即重载后的show方法。
阅读(2858) | 评论(0) | 转发(0) |