Python中的面向对象编程详解(下)
admin
2023-07-31 02:14:21
0

继承

继承描述了基类的属性如何“遗传”给派生类。一个子类可以继承它的基类的任何属性,不管是数据属性还是方法。
创建子类的语法看起来与普通(新式)类没有区别,一个类名,后跟一个或多个需要从其中派生的父类:

复制代码 代码如下:
class SubClassName (ParentClass1[, ParentClass2, …]):
    \’optional class documentation string\’
    class_suite

实例
复制代码 代码如下:
class Parent(object): # define parent class 定义父类
    def parentMethod(self):
    print \’calling parent method\’

class Child(Parent): # define child class 定义子类
    def childMethod(self):
    print \’calling child method\’

继承与覆盖

继承

不同于Java,python的子类继承父类后,会把父类的所有的方法,包括构造器init()也继承下来.

复制代码 代码如下:
class Parent():
    def __init__(self):
        print \”init Parent class instance\”

    def func(self):
        print \”call parent func\”

class Child(Parent):
    def __init__(self):
        print \”init Child class instance\”

child = Child()
child.func()

输出
复制代码 代码如下:
init Child class instance
call parent func

super关键字

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。语法如下

复制代码 代码如下:
super(type[, obj])

示例
复制代码 代码如下:
class C(B):
    def method(self, arg):
        super(C, self).method(arg)

注意

super继承只能用于新式类,用于经典类时就会报错。
新式类:必须有继承的类,如果没什么想继承的,那就继承object
经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』
实例

复制代码 代码如下:
class Parent(object):
    def __init__(self):
        self.phone = \’123456\’
        self.address = \’abcd\’

class Child(Parent):
    def __init__(self):
        super(Child, self).__init__()
        self.data = 100

def main():
    child = Child()
    print \”phone is: \”, child.phone
    print \”address is: \”, child.address
    print \”data is: \”, child.data

if __name__ == \’__main__\’:
    main()

输出
复制代码 代码如下:
phone is:  123456
address is:  abcd
data is:  100

重写

子类只要重新定义一个与父类的方法同名的方法,就可以重写覆盖父类的方法. 子类只要把上例父类的func(self)重写就行了.

复制代码 代码如下:
class Parent():
def __init__(self):
print \”init Parent class instance\”
def func(self):
print \”call parent func\”
class Child(Parent):
def __init__(self):
print \”init Child class instance\”

child = Child()
child.func()

输出
复制代码 代码如下:
init Child class instance
call Child func

多重继承

同 C++一样,Python 允许子类继承多个基类。但一般不推荐用多重继承.语法如下:

复制代码 代码如下:
class Father():
    def __init__(self):
        print \”init Father instance\”

class Mother():
    def __init__(self):
        print \”init Mother instance\”

class Child(Father, Mother):
    pass

类、实例和其他对象的内建函数

issubclass()

布尔函数判断一个类是另一个类的子类或子孙类。它有如下语法:

复制代码 代码如下:
issubclass(sub, sup)

isinstance()

布尔函数在判定一个对象是否是另一个给定类的实例时,非常有用。它有如下语法:

复制代码 代码如下:
isinstance(obj1, obj2)

attr()系列函数

●hasattr()
它的目的就是为了决定一个对象是否有一个特定的属性,一般用于访问某属性前先作一下检查。
●getattr()和setattr()
●getattr()和 setattr()函数相应地取得和赋值给对象的属性,

●delattr()
删除特定的属性

实例

复制代码 代码如下:
class Child(Parent):
    def __init__(self):
        self.data = 100

child = Child()
print \”has data attr?\”, hasattr(child, \’data\’)

print \”delete attr\”
delattr(child, \’data\’)

print \”has data attr?\”, hasattr(child, \’data\’)

print \”set data attr to 200\”
setattr(child, \’data\’, 200)
print \”data attr is: \”, getattr(child, \’data\’)

输出
复制代码 代码如下:
has data attr? True
delete attr
has data attr? False
set data attr to 200
data attr is:  200

私有化

Python没有像Java那样实现真正的封装,只是用双划线和单划线实现私有化.

●双划线
防止外部访问.如在func前加双划线,可以防止包括子类的实例的访问.

复制代码 代码如下:
    def __func(self):
        print \”call\”

●单划线
防止模块的属性用“from mymodule import *”来加载。

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...