python面向对象难学_面向对象是Python初学者必须学好的一个环节!月薪30万程序员详解...

47d8c4e36ce9aa872284e7b56a328772.png

88eede4c4b6d8e5794aad72eda2c2fd1.png

8489d7392f619b6336670cf197d8e1ca.png

58e134623f43faa19196b94fe0e4bff4.png

454bc3bbb6a07fe1cd9cb7761a74852c.png

二. 属性

在类中我们可以定义一些属性,比如:

2eaef8dd2c41261c97710ed82baaef3d.png

定义了一个people类,里面定义了name和age属性,默认值分别为'jack'和12。在定义了类之后,就可以用来产生实例化对象了,这句p = people( )实例化了一个对象p,然后就可以通过p来读取属性了。这里的name和age都是公有的,可以直接在类外通过对象名访问,如果想定义成私有的,则需在前面加2个下划线 ' __'。

2fb4d78ae63eea38a82e28e3448cc2c5.png

这段程序运行会报错:

86cd3a5cd84b67cac9f75b93ae760b3c.png

49acbb12de861042e8400d539d1e311b.png

9d70184f48b12a303b92ac7756acb2f8.png

a6dffa881bc3cf56b66822c10c55ba51.png

e015eed47bfbc98c2b0a8b20072f824a.png

构造方法__init__(self,....):在生成对象时调用,可以用来进行一些初始化操作,不需要显示去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。

析构方法__del__(self):在释放对象时调用,支持重载,可以在里面进行一些释放资源的操作,不需要显示调用。

还有其他的一些内置方法,比如 __cmp__( ), __len( )__等。下面是常用的内置方法:

内置方法

说明

__init__(self,...)

初始化对象,在创建新对象时调用

__del__(self)

释放对象,在对象被删除之前调用

__new__(cls,*args,**kwd)

实例的生成操作

__str__(self)

在使用print语句时被调用

__getitem__(self,key)

获取序列的索引key对应的值,等价于seq[key]

__len__(self)

在调用内联函数len()时被调用

__cmp__(stc,dst)

比较两个对象src和dst

__getattr__(s,name)

获取属性的值

__setattr__(s,name,value)

设置属性的值

__delattr__(s,name)

删除name属性

__getattribute__()

__getattribute__()功能与__getattr__()类似

__gt__(self,other)

判断self对象是否大于other对象

__lt__(slef,other)

判断self对象是否小于other对象

__ge__(slef,other)

判断self对象是否大于或者等于other对象

__le__(slef,other)

判断self对象是否小于或者等于other对象

__eq__(slef,other)

判断self对象是否等于other对象

__call__(self,*args)

把实例对象作为函数调用

__init__():__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化。注意,这个名称的开始和结尾都是双下划线。代码例子:

267dfd3a3d18d56e23fd8d2bbe8cfbe2.png

__new__():__new__()在__init__()之前被调用,用于生成实例对象。利用这个方法和类属性的特性可以实现设计模式中的单例模式。单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象。

e97858db8108ce42f9039961958c24c6.png

d99fbd21a1beeee8fa33d328af685a61.png

fce19ddcc092f4145631e6260207a863.png

Python不允许实例化的类访问私有数据,但你可以使用object._className__attrName访问这些私有属性。

__getitem__():如果类把某个属性定义为序列,可以使用__getitem__()输出序列属性中的某个元素.假设水果店中销售多钟水果,可以通过__getitem__()方法获取水果店中的没种水果。代码例子:

6adace0383c61e6458a80f67868e5679.png

fc5581d4676570b45ad2fc959f66c5f7.png

6d83672c8097e022cb6384470ee01eef.png

__call__():在类中实现__call__()方法,可以在对象创建时直接返回__call__()的内容。使用该方法可以模拟静态方法。代码例子:

910485e7624837e5b269b322bd947071.png

bdb8f62e88d48e85baa7e769d0941a0b.png

67376dea44a9d4b1cae60e1462ca80be.png

cc4e3c1fa44b0f6beef0e3154aa57f7a.png

在类外对类对象people进行实例化之后,产生了一个实例对象p,然后p.age = 12这句给p添加了一个实例属性age,赋值为12。这个实例属性是实例对象p所特有的,注意,类对象people并不拥有它(所以不能通过类对象来访问这个age属性)。当然还可以在实例化对象的时候给age赋值。

e2a9c5e9c03c69cd20f1c9c96cd3ff47.png

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

7b7d29f93c285099762897cfe6dcea2a.png

ecf81c6013f3766e4c0ee3b1edfac72b.png

24b3a1e08b032bec4891e3ba39264739.png

类方法还有一个用途就是可以对类属性进行修改:

94b91307af1344509271160e92060301.png

5d789074968f6de1a26c83f9ffc96b52.png

实例方法:在类中最常定义的成员方法,它至少有一个参数并且必须以实例对象作为其第一个参数,一般以名为'self'的变量作为第一个参数(当然可以以其他名称的变量作为第一个参数)。在类外实例方法只能通过实例对象去调用,不能通过其他方式去调用。

5189e5542ffad74322359882425a1894.png

静态方法:需要通过修饰器"@staticmethod"来进行修饰,静态方法不需要多定义参数。

23394c7021ed217455f2570ee4699c94.png

11e16e4799f72b28b6fa9be0e4549190.png

六. 继承和多重继承

上面谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。

在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Python支持多继承,能够让一个子类有多个父类。

Python中类的继承定义基本形式如下:

89e1099a56a087b15e4aea9d98a386b5.png

9e1d865f61cda8eb978801be636438a1.png

0e801e320da55384b4f3842372a5e723.png

aae72453a259e548d0bc760d15bec0a3.png

此时有一个问题就是如果SubClass没有重新定义构造方法,它会自动调用哪个父类的构造方法?这里记住一点:以第一个父类为中心。如果SubClass重新定义了构造方法,需要显示去调用父类的构造方法,此时调用哪个父类的构造方法由你自己决定;若SubClass没有重新定义构造方法,则只会执行第一个父类的构造方法。并且若SuperClass1和SuperClass2中有同名的方法,通过子类的实例化对象去调用该方法时调用的是第一个父类中的方法。

7ff710e8226ec0cc1ac2d966c18b2abc.png

能够直接说明多态的两段示例代码如下:

1、方法多态

86afb379b44a048a89ce428627e06df9.png

765df9e452ff1b5d668eeee53efc221e.png

f7cb9568db71a1ab97e6c82c1d40c307.png

就in_the_forest函数而言,参数对象是一个鸭子类型,它实现了方法多态。但是实际上我们知道,从严格的抽象来讲,Person类型和Duck完全风马牛不相及。

2、运算符多态

835ab84d26591c0625216defab439e90.png

上例中,显而易见,Python的加法运算符是”多态“的,理论上,我们实现的add方法支持任意支持加法的对象,但是我们不用关心两个参数x和y具体是什么类型。

Python同样支持运算符重载,实例如下:

0f96010e25d2b621a3af67011b3d7b0a.png

python团长

如果对你有帮助

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值