Python面向对象进阶教程,Python面向对象进阶知识笔记.doc

上传人:封****n 文档编号:96697937 上传时间:2024-03-10 格式:DOC 页数:26 大小:475.49KB
返回 下载 相关 举报
Python面向对象进阶教程,Python面向对象进阶知识笔记.doc_第1页
第1页 / 共26页
Python面向对象进阶教程,Python面向对象进阶知识笔记.doc_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《Python面向对象进阶教程,Python面向对象进阶知识笔记.doc》由会员分享,可在线阅读,更多相关《Python面向对象进阶教程,Python面向对象进阶知识笔记.doc(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、类方法、静态方法1. 类方法 第一个形参是类对象的方法 需要用装饰器classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。class Dog(object): _type = 狗 # 类方法,用classmethod来进行修饰 classmethod def get_type(cls): return cls._typeprint(Dog.get_type()使用场景: 当方法中需要使用类对象(如访问私有类属性等)时,定义类方法 类方法一般和类属性配合使用2. 静态方法 需要通过装饰器staticmethod来进行修饰,静态方法既不需要传递类对

2、象也不需要传递实例对象(形参没有self/cls)。 静态方法 也能够通过实例对象和类对象去访问。class Dog(object): type = 狗 def _init_(self): name = None # 静态方法 staticmethod def introduce(): # 静态方法不会自动传递实例对象和类对象 print(犬科哺乳动物,属于食肉目.)dog1 = Dog()Dog.introduce() # 可以用 实例对象 来调用 静态方法dog1.introduce() # 可以用 类对象 来调用 静态方法用场景: 当方法中既不需要使用实例对象(如实例对象,实例属性),也

3、不需要使用类对象(如类属性、类方法、创建实例等)时,定义静态方法 取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗注意点: 类中定义了同名的方法时,调用方法会执行最后定义的方法class Dog: def demo_method(self): print(对象方法) classmethod def demo_method(cls): print(类方法) staticmethod def demo_method(): # 被最后定义 print(静态方法)dog1 = Dog()Dog.demo_method() # 结果: 静态方法dog1.demo_method() # 结果:

4、静态方法_new_和_init_方法class A(object): def _init_(self): print(这是 init 方法) def _new_(cls): print(这是 new 方法) return object._new_(cls)A()总结 _new_至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供 _new_必须要有返回值,返回实例化出来的实例,这点在自己实现_new_时要特别注意,可以return父类_new_出来的实例,或者直接是object的_new_出来的实例 _init_有一个参数self,就是这个_new_返回的实例

5、,_init_在_new_的基础上可以完成一些其它初始化的动作,_init_不需要返回值# 实例化一个单例class Singleton(object): _instance = None _is_first = True def _new_(cls, age, name): if not cls._instance: cls._instance = object._new_(cls) return cls._instance def _init_(self, age, name): if self. _is_first: # 不会再创建第二个对象 self.age = age self.na

6、me = name Singleton. _is_first = Falsea = Singleton(18, 张三)b = Singleton(28, 张三)print(id(a)print(id(b)print(a.age) # 18print(b.age) # 18a.age = 19print(b.age)继承的基本使用在现实生活中,继承一般指的是子女继承父辈的财产,父辈有的财产,子女能够直接使用。程序里的继承继承是面向对象软件设计中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。 在程序中,继承描述的是多个类之间

7、的所属关系。 如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。 那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。class Animal: def _int_(self): pass 动物类 def sleep(self): print(正在睡觉)class Dog(Animal): Dog类继承自Animal类 def _init_(self): passclass Cat(Animal): # 定义类时,在括号后面传入父类的类名,表示子类继承父类 Cat类继承自Animal类 def _int_(self): pass# Dog 和 Cat 都继承自An

8、imal类,可以直接使用Animal类里的sleep方法dog = Dog()dog.sleep()cat = Cat()cat.sleep()在Python中,继承可以分为单继承、多继承和多层继承。单继承:子类只继承一个父类继承概念:子类用于父类的所有的方法和属性。继承语法:class 类名(父类名): pass 子类继承自父类,可以享受父类中已经封装好的方法,不需要再次定义 子类中应该根据职责,封装子类特有的属性和方法。继承的传递性Dog类继承自Animal,XiaoTianQuan又继承自Dog类,那么XiaoTianQuan类就具有了Animal类里的所有属性和方法。子类拥有父类以及父

9、类的父类中封装的所有属性和方法。思考:XiaoTianQuan能否调用Animal的run()方法? XiaoTianQUan能够调用Cat里的方法?多继承子类可以拥有多个父类,并且具有所有父类的属性和方法。语法格式:class 子类名(父类名1,父类名2.) pass多继承的使用注意事项思考:如果不同的父类中存在同名的方法,子类对象在调用方法时,会调用哪个父类的方法? 说明:开发中,应该尽量避免这种容易产生混淆的情况。如果多个父类之间存在同名的属性后者方法,应该尽量避免使用多继承。Python中的MRO Python中针对类提供了一个内置属性_mro_可以用来查看方法的搜索顺序。 MRO 是

10、method resolution order的简称,主要用于在多继承时判断方法属性的调用顺序。print(C._mro_)输出结果:(, , , ) 在调用方法时,按照_mro_的输出结果从左至右的顺序查找。 如果再当前类中找到方法,就直接执行,不再向下搜索。 如果没有找到,就顺序查找下一个类中是否有对应的方法,如果找到,就直接执行,不再继续向下搜索。 如果找到了最后一个类,依然没有找到方法,程序就会报错。新式类和旧式(经典)类object是Python中所有对象的基类,提供了一些内置的属性和方法,可以时候用dir函数查看。 新式类:以object为基类的类,推荐使用 经典类:不以objec

11、t为基类的类,不推荐使用 在 Python3.x 以后定义类时,如果没有指定父类,这个类会默认继承自 object,所以,python3.x版本定义的类都是新式类。 在Python2.x中定义类时,如果没有指定父类,则不会继承自object.为了保证代码在Python2.x和Python3.x中都能够运行,在定义类时,如果一个类没有父类,建议统一继承自objectclass 类名(object): pass对象相关的内置函数Python中的身份运算符用来判断两个对象是否相等;isinstance用来判断对象和类之间的关系;issublcass用啊里判断类与类之间的关系。身份运算符身份运算符用来

12、比较两个对象的内存地址,看这两个对象是否是同一个对象。class Person(object): def _init_(self, name, age): self.name = name self.age = agep1 = Person(张三, 18)p2 = Person(张三, 18)p3 = p1print(p1 is p2) # Falseprint(p1 is p3) # Trueisinstanceinstance内置函数,用来判断一个实例对象是否是由某一个类(或者它的子类)实例化创建出来的。class Person(object): def _init_(self, name

13、, age): self.name = name self.age = ageclass Student(Person): def _init_(self, name, age, score): super(Student, self)._init_(name, age) self.score = scoreclass Dog(object): def _init_(self, name, color): self.name = name self.color = colorp = Person(tony, 18)s = Student(jack, 20, 90)d = Dog(旺财, 白色)

14、print(isinstance(p, Person) # True.对象p是由Person类创建出来的print(isinstance(s, Person) # True.对象s是有Person类的子类创建出来的print(isinstance(d, Person) # False.对象d和Person类没有关系issubclassissubclass 用来判断两个类之间的继承关系。class Person(object): def _init_(self, name, age): self.name = name self.age = ageclass Student(Person): d

15、ef _init_(self, name, age, score): super(Student, self)._init_(name, age) self.score = scoreclass Dog(object): def _init_(self, name, color): self.name = name self.color = colorprint(issubclass(Student, Person) # Trueprint(issubclass(Dog, Person) # False多态面向对象的三大特性: 封装:这是定义类的准则,根据对象的特点,将行为和属性抽象出来,封装

16、到一个类中。 继承:这是设计类的技巧。父类与子类,主要体现在代码的重用,不需要大量的编写重复代码。 多态:不同的子类调用相同的父类方法,产生不同的执行结果,可以增加代码的外部灵活度。多态是以继承和重写父类方法为前提的,它是一种调用方法的技巧,不会影响到类的内部设计。场景 提供三个类:缉毒犬、军犬、人 缉毒犬-追查毒品,军犬-攻击假人,人-让小狗干活 设计类来完成功能。代码实现:class ArmyDog(object): def bite_enemy(self): print(追击敌人)class DrugDog(object): def track_drug(self): print(追查毒

17、品)class Person(object): def work_with_army(self, dog): dog.bite_enemy() def work_with_drug(self, dog): dog.track_drug()ad = ArmyDog()dd = DrugDog()p = Person()p.work_with_army(ad)p.work_with_drug(dd)思考:这段代码设是否有问题?新增需求:此时,又多了一个犬种,就又需要在Person类里新建一个方法,让这个方法操作新的狗。class XiaoTianDog(object): def eat_moon(

18、self): print(哮天犬把月亮吃了)class Person(object): def work_with_xiaotian(self, dog): # 添加方法 dog.eat_moon()Person 类总是不断的添加新的功能,每次都需要改动Person类的源码,程序的扩展性太差了! 最好是提供一个父类 Dog,具备 work 的功能,其他小狗继承它,这样只要是小狗类,则行为被统一起来了,我们人类完全可以保证,只要是小狗的子类,找它干活肯定不会有问题。 这样人只要一个方法就能逗任意种类的狗玩,哪怕是添加新的狗,人的类都不需要修改。 图示如下:代码实现:class Dog(objec

19、t): def work(self): # 父类提供统一的方法,哪怕是空方法 passclass ArmyDog(Dog): # 继承 Dog def work(self): # 子类重写方法,并且处理自己的行为 print(追击敌人)class DrugDog(Dog): def work(self): print(追查毒品)class Person(object): def work_with_dog(self, dog): dog.work() # 使用小狗可以根据对象的不同而产生不同的运行效果, 保障了代码的稳定性# 子类对象可以当作父类来使用dog = Dog()ad = ArmyD

20、og()dd = DrugDog()p = Person()p.work_with_dog(dog)p.work_with_dog(ad) # 同一个方法,只要是 Dog 的子类就可以传递,提供了代码的灵活性p.work_with_dog(dd) # 并且传递不同对象,最终 work_with_dog 产生了不同的执行效果 最终效果o Person 类中只需要调用 Dog 对象 work() 方法,而不关心具体是 什么狗o work() 方法是在 Dog 父类中定义的,子类重写并处理不同方式的实现o 在程序执行时,传入不同的 Dog 对象作为实参,就会产生不同的执行效果多态总结 定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果 好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化! 实现步骤:o 定义父类,并提供公共方法o 定义子类,并重写父类方法o 传递子类对象给调用者,可以看到不同子类执行效果不同

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 初中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com