一、类定义和使用
1.1.类定义
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。创建类:
使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾:
class ClassName:
'类的帮助信息' #类文档字符串
class_suite #类体类的帮助信息可以通过ClassName.__doc__查看。
class_suite 由类成员,方法,数据属性组成。
示例:
class EmployeeInfo(object):
"所有员工的基类"
empCont=0
def __init__(self,name,salary):
self.name=name
self.salary=salary
self.empCont+=1
def displayCount(self):
print("Total Employee {0}".format(self.empCont))
def displayEmployee(self):
self.displayCount()
print("Name: {0},Salary: {1}".format(self.name,self.salary))
employeeInfo=EmployeeInfo("test","6500")
employeeInfo.displayCount()
employeeInfo.displayEmployee()
employeeInfo.name
通过以上示例可以看出:
1.类的名称定义采用驼峰规则,即每个单词的首字母为大写,其余为小写
2.定义的类都继承object基类
3.类一般是由很多函数组成,每个函数的第一个参数必须为self,实例化参数赋值时忽略不计
4.类变量:如果类需要一个全局变量,可以在类的内部定义,如empCont,但是类的内部调用定义的函数或变量时,需要在名称添加self.,即用self.函数名或self.变量名,如self.empCont
5.self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数
1.2.类对象
类对象支持两种操作:属性引用和实例化。如示例中的变量empCont,函数displayCount和displayEmployee都是类对象1.2.构造函数
def __init__(self,name,salary):self.name=name
self.salary=salary
self.empCont+=1类在初始化的时候,首先必须要执行的函数
1.3.类型的实例化
要创建类的实例,可以使用类名调用该类,并传递其__init__方法接受的任何参数。如:employeeInfo=EmployeeInfo("test","6500")
1.4.访问类的属性
前提:需要进行类的实例化可以使用带有对象的点(.)运算符来访问对象的属性。 类变量将使用类名访问如下 :
employeeInfo.displayCount()
employeeInfo.displayEmployee()
1.5.类的继承及多继承
1.5.1.单继承
通过对父类的继承,子类可以使用父类的函数及非私有的变量示例:
#父类
class Bank():
__CenterInfo=str()
name=str()
address=str()
def __init__(self,name,address):
self.name=name
self.address=address
def displayName(self):
print("当前的银行的名称为:{0}".format(self.name))
def displayAddress(self):
print("此银行的地址为:{0}".format(self.address))
#子类
class GongShang(Bank): #括号内被继承的父类
def introduceBank(self):
print("这是一家国企,是个弱势群体")
gongShang=GongShang("工商银行","江苏镇江扬州")
gongShang.displayName()
gongShang.displayAddress()
gongShang.introduceBank()
print("##"*30)
gongShang2=GongShang("中国工商银行","江苏分行")
print("变量名name实例化:{0}".format(gongShang2.name))
print("变量名address实例化:{0}".format(gongShang2.address))
子类GongShang通过继承父类Bank,可以调用父类的函数displayName、displayAddress及变量name、address
1.5.2.多继承
一个子类可以继承多个父类示例:
#父类
class Bank():
__CenterInfo=str()
name=str()
address=str()
def __init__(self,name,address):
self.name=name
self.address=address
print("中国央行规定")
def displayName(self):
print("当前的银行的名称为:{0}".format(self.name))
def displayAddress(self):
print("此银行的地址为:{0}".format(self.address))
def makeRule(self):
print("我是中国最有钱的机构")
class WorldBank():
country=str()
cityNum=int()
def __init__(self,country,cityNum):
self.country=country
self.cityNum=cityNum
print("世界银行发表声明")
def cityInfo(self):
print("世界银行总部大楼在{0},可以给所在的城市提供{1}城市编号".format(self.country,self.cityNum))
def sayInfo(self):
print("我们需要中国银行提供存款信息")
#子类
class GongShang( Bank,WorldBank): #分别继承了Bank和WorldBank类
def displayName(self):
super(GongShang, self).displayName()
print("{0}重写了此方法,请注意".format(self.name))
def introduceBank(self):
print("这是一家国企,是个弱势群体")
class JianShe( WorldBank,Bank): #分别继承了WorldBank和Bank类
def sayBank(self):
print("银行存钱可以不用预约,但取钱需要提前预约")
gongShang=GongShang("工商银行","江苏镇江扬州")
gongShang.displayName()
gongShang.displayAddress()
gongShang.sayInfo()
print("**"*30)
jianShe=JianShe("美国",56)
jianShe.cityInfo()
jianShe.sayInfo()
jianShe.sayBank()
jianShe.makeRule()
1.6.方法重写
在有继承关系的类中,如果子类想要修改父类中的方法,可以在子类对父类的方法重新定义,即重写示例:
#父类
class Bank():
__CenterInfo=str()
name=str()
address=str()
def __init__(self,name,address):
self.name=name
self.address=address
print("中国央行规定")
def displayName(self):
print("当前的银行的名称为:{0}".format(self.name))
def displayAddress(self):
print("此银行的地址为:{0}".format(self.address))
#子类
class GongShang(Bank):
def displayName(self): #重写父类的display方法
print("{0}重写了此方法,请注意".format(self.name))
def introduceBank(self):
print("这是一家国企,是个弱势群体")
gongShang=GongShang("工商银行","江苏镇江扬州")
gongShang.displayName()
gongShang.displayAddress()
结果
中国央行规定
工商银行重写了此方法,请注意
此银行的地址为:江苏镇江扬州
如果子类重写了父类的方法,但希望父类的方法继续执行,可以使用super调用父类的方法
示例:
#父类
class Bank():
__CenterInfo=str()
name=str()
address=str()
def __init__(self,name,address):
self.name=name
self.address=address
print("中国央行规定")
def displayName(self):
print("当前的银行的名称为:{0}".format(self.name))
def displayAddress(self):
print("此银行的地址为:{0}".format(self.address))
#子类
class GongShang(Bank):
def displayName(self):
super(GongShang, self).displayName() #执行父类的displayName方法,同时也执行了子类的displayName方法
print("{0}重写了此方法,请注意".format(self.name))
def introduceBank(self):
print("这是一家国企,是个弱势群体")
gongShang=GongShang("工商银行","江苏镇江扬州")
gongShang.displayName()
gongShang.displayAddress()
中国央行规定
当前的银行的名称为:工商银行
工商银行重写了此方法,请注意
此银行的地址为:江苏镇江扬州
1.7.类的私有属性及私有方法
1.7.1.类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。示例
class JustConter():
__secretCount=0 #私有变量
publicCount=0 #公共变量
def count(self):
self.__secretCount+=1
self.publicCount+=1
print("类中打印私有变量:{0}".format(self.__secretCount))
counter=JustConter()
counter.count()
print("类实例化,打印公共变量:{0}".format(counter.publicCount))
print("类实例化,打印私有变量:{0}".format(counter.__secretCount)) #报错,实例不能访问私有变量
结果
Traceback (most recent call last):
File "D:/pythoncode/LivePython02/12第九节课/test9003.py", line 19, in <module>
print("类实例化,打印私有变量:{0}".format(counter.__secretCount)) #报错,实例不能访问私有变量
AttributeError: 'JustConter' object has no attribute '__secretCount'
类中打印私有变量:1
类实例化,打印公共变量:1
1.7.2.类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用。self.__private_methods。示例
class Site():
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url)
def __foo(self): # 私有方法
print('这是私有方法')
def foo(self): # 公共方法
print('这是公共方法')
self.__foo()
x = Site('普惠数码', 'www.phdata.cn')
x.who() # 正常输出
x.foo() # 正常输出
x.__foo() # 报错
结果
name : 普惠数码
url : www.phdata.cn
这是公共方法
这是私有方法
Traceback (most recent call last):
File "D:/pythoncode/LivePython02/12第九节课/test9004.py", line 26, in <module>
x.__foo() # 报错
AttributeError: 'Site' object has no attribute '__foo'
1.6.类的专有方法
__init__ : 构造函数,在生成对象时调用__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方
示例:
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return 'Vector (%d, %d)' % (self.a, self.b)
def __add__(self,other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)
运行结果
Vector(7,8)