Python深入学习之面向对象编程(类操作)

一、关于面向对象
面向对象编程的核心就是类的操作,包括了类的定义、引用、继承等。刚开始学这方面的内容时,会感觉比较抽象。怎么理解这个东西呢?在我看来,就是唯物辩证法的理论和实践相统一,定义类就是明确理论,明确抽象的东西是什么。实例化就是把抽象的东西具体化。我们可以举个例子来说就相对比较容易理解了:
我们定义一个鸟这种动物的类,那么我们首先要知道具备什么样的属性才能叫做鸟,比如能自己飞翔、自己有羽毛、有翅膀的动物我们识别为鸟(当然,也可能会有其他特性,这里简化处理。)这就把鸟这种事物抽象出来了,就定义了类的概念。相应的我们也要把抽象的鸟的概念实例化。比如:鸽子就是一种鸟的形态、麻雀、大雁都是。为什么呢?因为它们都具备能飞翔、有羽毛、有翅膀这个特性。那我们进而也得出像马牛羊都不是鸟的实例。
那么类是一成不变的吗?当然不是,我们需要与时俱进、需要推陈出新,前面我对鸟的定义就不一定准确。比如鸭子就有以上特性,我们还是把它定义成家禽,并没有定义成鸟。软件编程里,把对类的定义的修改规范了两种路径,一是动态的增删类的属性,也就是在能飞翔、有羽毛、有翅膀的基础上,我们可以任意增删或修改定义的元素,比如我们增加一条尚未被人类驯化。就把鸭子排除了(例子可能相对牵强一些,比如野鸭也算鸭子,这里就不争辩了)。然而,我们用的另一种方式会更多,那就是继承。类似父亲有儿子,儿子继承父亲的全部特点后,可以有自己的特点。这样做的好处是我们可以构建一种树形的继承关系,每次更新内容重点更新继承类(我们叫子类,原有的类叫父类或者基类)即可完成需要完善的功能,操作起来就更加方便了。
二、实例说明
这里直接通过代码实例来看一看类的使用:
(一)定义一个类
python里,所有类的定义是class开头的,然后是类名:加内容(至少有一句代码,如果不想有其他操作,可以写pass做一个空类)。
代码:

class BaseQX:
    print('这是一个类!')

(二)实例化这个类
EXP1=BaseQX() #实例化类时,需要加括号
很简单,EXP1是类的实例,系统会自动执行代码,输出"这是一个类!"
(三)初始化一个类的定义
初始化类时,需要用到__init__这个内置函数。而函数里的self是系统默认的类本身的实例。当执行时,self不用单独再行操作。
系统会优先查看__init__的函数的内容执行。其他函数作为实例化的内部函数,需要调用执行。需要注意的是,第二行print语句也会自动执行,且先于__init__,这是因为系统顺序执行代码,print没有在函数下,我们正常写代码时,建议把输出信息都置于类的函数下就不会有这种现象。
代码:

class BaseQX:
    print('这是一个基类!')
    pass  #当类里什么都没有,可以直接加一个pass变成一个空的基类
    def __init__(self):
        print('基类初始化!')
    def printstr(self,name,add='增加信息'):
        print(self,name,add)

实例化:

 EXP1=BaseQX() #实例化类时,需要加括号,否则无法调用Init()方法
 EXP1.printstr('你好!','欢迎!')#当传递内容时,将根据类中自定义信息进行执行!

输出的结果为:
这是一个基类!
基类初始化!
<main.BaseQX object at 0x00000000027BE308> 你好! 欢迎!
(四)类的继承(子类)
做子类,只需在需要定义的类后面加括号和父类的名字。同时,__init__可以不用写了,子类直接调用了父类的函数。当然,如果函数有需要修改的,直接用def重新这是同名函数的代码即可实现。
代码:

class SubQX2(BaseQX):
    def printstr(self):
        print("重写父类方法!")

实例化:

    EXP4_1=SubQX2()  #会直接执行基类init方法
    EXP4_1.printstr() #对基类printstr函数进行了重写

输出的结果为:
基类初始化!
重写父类方法!
这里,补充两个知识点,类方法和类的静态方法,用于类的内部操作使用,平时用的不多,了解即可。
代码:

    @classmethod #类方法,不需要self参数,只需cls参数,没有实例化
    def info(cls):
        print("正在调用类方法", cls)

    @staticmethod  #类的静态方法,没有self\info的调用信息能力
    def infostatic(name, add):
        print(name, add)

(五)类的成员属性配置
类的内部成员,会有读、写、删除几种属性,这里有一个固定的格式如下:
写的很清楚了,就不在一一赘述了

class BaseQX2:  #用于验证属性配置功能
    def __init__(self,n):
        self.__name=n
    def setname(self,n):
        self.__name=n
    def getname(self):
        return self.__name
    def delname(self):
        self.__name="xxx"
    # 以下设置name的属性为可读、不可写、也可删除,否则没有标注说明不可读、不可写或者不可删除
    name = property(getname, delname, '指明出处')#setname,
    def __display(self):  #这个私有方法是不能调用的
        print("测试私有方法!")

实例化测试:

	EXP3_1=BaseQX2("属性测试")
    help(BaseQX2.name)
    print(EXP3_1.name)

结果:
Help on property:

属性测试
(六)多继承
实际就是多个父类(两个及以上均可),很简单

class MulSubQX1(BaseQX,BaseQX2):#多继承
    pass

结果(其实就是多个基类的初始化之和):
基类初始化!
重写父类方法
(七)实例的销毁
虽然平时我们练习时,实例创建后,不进行销毁操作正常不会报错,但是实际是增加了内存空间的操作负担,因此,在类实例化用完后,建议都进行销毁操作,很简单,执行代码 del 实例名1,实例名2,… 即可。
(八)一组特殊用途的方法
见代码实例:

class newmethod:#练习new方法等特殊方法
    ins_cre=0
    def __new__(cls, *args, **kwargs):#在init方法之前就执行
        print("__new__():",cls,args,kwargs)
        ins=super().__new__(cls)
        ins.num=cls.ins_cre
        cls.ins_cre+=1
        return ins
    def __init__(self,attr):
        print("__init__():",self,attr)
        self.attr=attr
    def __repr__(self):
        return "用于自我介绍/描述具体信息时使用"
    def __del__(self):
        print("对象销毁后执行此代码")
    def __call__(self, *args, **kwargs):  #方法重载
        print("调用__call__()方法:",args,kwargs)

大家只需记住这些方法的用途,需要用时查找使用即可。都是前后两个下划线
(九)一些操作类属性的函数
见代码实例,由于备注写的比较详细了,这里不再赘述:

    print(dir(test1))#输出对象可以运行的所有属性及方法
    print(test1.__dict__) #输出对象的字典
    print(hasattr(test1,"attr"))#查看实例test1是否有属性attr
    print(getattr(test1,"attr"))#查看实例test1的属性attr的值
    setattr(test1,"attr","现在设置属性值")#设置属性值
    print(test1.attr)
    print(isinstance(test1.attr,str))#检查test1.attr是否为实例
    print(issubclass(MulSubQX1,object))#检查MulSubQX1是否为子类

执行结果如下:
[‘call’, ‘class’, ‘del’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’, ‘attr’, ‘ins_cre’, ‘num’]
{‘num’: 0, ‘attr’: ‘abc’}
True
abc
现在设置属性值
True
True
三、其他说明
(一)类作为python中普遍使用的功能,建议在编写代码时,要优先考虑类的定义作为主框架。
(二)定义变量/函数时,单下划线一般为保护属性,只可类和其子类调用。双下划线为私有属性,只可类自己使用。
(三)基类内容要逐步抽象化,共性内容放到基类,相关个性的放到子类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值