python学习-第9课

一、类定义和使用

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)


猜你喜欢

转载自blog.csdn.net/biankm_gz/article/details/80014626