Python面向对象编程备忘



查看原文:http://www.wyblog.cn/2016/11/30/python%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e7%bc%96%e7%a8%8b%e5%a4%87%e5%bf%98/

本博文总结自廖雪峰老师python教程:

http://www.liaoxuefeng.com/

基本知识篇


1.核心思想是把对象作为程序的基本单元,对象里封装了自身的数据以及操作数据的函数。每个对象都可以接收其他对象发来的消息,并进行处理。面向对象程序的设计思想是抽象出类(class)与实例(instance)的概念,定义类可以class Student(object):,生成实例则可以用bart=Student()

2.类的特殊方法: def __init__(self,arg1,arg2),类里加入了此方法后,在初始化实例的时候会自动给实例属性赋值,并且,传入参数个数必须与声明的arg个数一样。第一个self参数表示的是创建的实例本身,这个不用传,由解释器自动传入。

3.和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。

4.如果想让内部属性不让外部访问,则可在属性名前加入两个下划线 __ ,它就变为了一个private变量了。例如self.__name=name赋值后,在外部是访问不了这个name的。如果是单下划线_,则表示不要随意访问这个变量。 需要注意的是,在Python中,变量名类似 __xxx__ 的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用 __name____score__ 这样的变量名。

5.面向对象的继承概念是指,定义一个class时可以从现有的class继承,并且拥有父类的所有属性与方法。例如原有个Animal的class,现在class Dog(Animal):就可以使Dog继承自Animal了(注意,所有类都继承于object这个类)。 当子类和父类存在同名方法时,运行时总会调用子类的方法,除非将子类的此方法给删除。

6.获取对象信息可以用type()或者isinstance()。type用于检测对象信息,例如type(123),type('abc'),type(abs)。isinstance可以检测实例与类的对应关系。

7.可以用dir()来查看一个对象的所有属性和方法。 调用方法为什么有的是len('ABC'),有的是'ABC'.len()。这里要注意的是,在class内部实现方法时,我们可以只定义一个形参self,而这个形参还是自动调用的,所以可以使用'ABC'.len(),即这个len()方法是在class内实现的。当在外部定义函数,def len(*arg,**kw):时可以看到,必须把对象给传入进去才行,所以用len('ABC')。

8.查看对象是否有某种属性用hasattr(obj,'x'),设置新增属性用setattr(obj,'y',19),获取某种属性getattr(obj,'y')(此可加第三个参数,作为没有检测到目标参数时的默认返回值)。

9.在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

进阶篇


1.Python具有动态特性,能够随意给实例或者类绑定新的属性或方法,例如对于一个Student类,里面没有任何属性或者方法,定义实例s1,那么可以动态绑定s1.age=21,那么实例s1就有了age属性,可以from types import MethodType后,给实例绑定方法,例如s1.set_age=MethodType(set_age,s1),这里括号里的set_age方法需要自己外部实现。另外,想给类绑定方法,可以直接Student.set_age=set_age,这条语句是指在类里绑定一个属性值set_age,使它指向外部set_age方法。

2.为了限制新添加的实例属性,可以在定义class的时候,定义个特殊的变量__slots__,例如:


class Student(object): __slots__=('name','age')

然后,生成实例后,就只能给实例添加name与age这两种属性了。注意,属性要用tuple来定义。另外,slots只对当前class起作用,对继承的子类是不起作用的。

3.@property,从形式上看,其实它就是个装饰器,只不过这个装饰器是用于定义class时的内部的,作用是简化参数调用与设置。一般来说,对于Student类,我们设置及读取分数时都是s.set_score(90)以及s.get_score()。而使用装饰器后,我们的读写都可以仅使用属性名称来操作,简化了许多。例如:


class Student(object): @property def score(self): return self._score @score.setter def score(self, value): if not isinstance(value, int): raise ValueError('score must be an integer!') if value < 0 or value > 100: raise ValueError('score must between 0 ~ 100!') self._score = value

对于以上,要注意几点。首先,读写的方法名称都是一样的,都是score。对于读的方法,用@property,对于写入的,用@xxxx.setter ,这个xxxx就是方法名称,这是固定套路。

4.类的继承不一定是单一的,可以同时继承多个类。例如:class Dog(Mammal,Runnable),就可以同时获得所有父类的功能了。这种多继承设计模式叫Mixln。在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。



查看原文:http://www.wyblog.cn/2016/11/30/python%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e7%bc%96%e7%a8%8b%e5%a4%87%e5%bf%98/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值