day22:面向对象封装对象操作&类操作&面向对象删除操作
目录1.面向对象程序开发 2.面向对象封装:对象的相关操作 3.面向对象封装:类的相关操作 4.实例化的对象/定义的类删除公有成员属性和公有成员方法 面向对象程序开发?1.类的三种定义方式class MyClass: pass class MyClass(): #(推荐) class MyClass(object): object类是所有类的父类 pass 2.类的实例化MyCar(): color = "黄色的" 实例化对象 (类的实例化) obj = MyCar() 3.类的基本结构类的基本结构包括成员属性和成员方法 """ 1.成员属性 2.成员方法 """ MyCar(): 成员属性 color = 天蓝色的" 成员方法 def didi(): print(小车会滴滴叫") 4.注意:在类中不能写逻辑语句或循环语句这种写法可以直接在python当中执行,但是严禁使用. 如果想要表达逻辑或者循环, 需要写在成员方法当中,不能直接裸露的写在类当中,会破坏类中结构. if 5 == 5: 打印成功123456") 5.类的命名驼峰命名法 : 推荐起类名的时候,使用大驼峰命名法. 面向对象封装:对象的相关操作1.关于封装的相关概念封装等级: ? 定义一个MyCar类,并定义公有/私有成员属性和公有/私有成员方法 公有成员属性 color = 屎黄色" logo = 中国吉利汽车 私有成员属性 __price = 2000万" 公有成员方法 run(self): 小车会跑,百公里0.01秒,颜色{}".format(self.color)) self <=> obj 私有成员方法 def __info(self): 车主信息是保密的,传说是京城有名的富二代) 实例化对象(类的实例化) obj = MyCar() 2.实例化的对象访问公有成员属性和方法访问属性 print(obj.color) obj.__price error # 私有成员属性不能够在类外调用 访问方法 obj.run() obj.__info() error # 私有成员方法不能够在类外调用 3.实例化的对象动态添加公有成员属性和方法1.在类外动态添加成员属性-->通过obj对象 可以在类外通过对象.属性为对象添加属性 obj.logo = 五菱宏光" print(obj.logo) 如果想确认obj对象中是否有你新添加的logo属性,可以使用对象.__dict__获取类对象中的成员 ? 2.在类外动态添加成员方法-->通过obj对象 在类外动态添加成员方法,可分为无参方法和有参方法 1.无参方法 dahuangfeng(): 变形! 我是大黄蜂~) obj.dahuangfeng = dahuangfeng obj.dahuangfeng() 2.有参方法 # 2.1 基础版 qingtianzhu(name): 请我叫我一柱擎天,简称{}.format(name)) obj.qingtianzhu = qingtianzhu obj.qingtianzhu(擎天柱) 2.2 升级版 qingtianzhu(obj,name): .format(name,obj.color)) obj.qingtianzhu = qingtianzhu obj.qingtianzhu(obj,) 2.3 究极版 (即使调用类外动态创建的方法,也让系统自己传递obj对象本身) '''在类外调用自定义方法时,系统不会自动传递obj对象参数''' import types MethodType(方法,对象) 把哪个方法和哪个对象绑定到一起,形成绑定方法 obj.qingtianzhu = types.MethodType(qingtianzhu,obj) obj.qingtianzhu(") 3.也可以使用lambda表达式实现在类外添加方法 obj.weizhentian = lambda : 我是威震天~ ) obj.weizhentian() 面向对象封装:类的相关操作类调用的方式也是两种:类.成员属性和类.成员方法 但是需要注意的是:类中的无参方法只能由类来调用!! 定义一个MyCar类,并定义其公私有属性和方法 公有属性 oil = 2.0T 私有属性 5000千万 公有方法 oil_info(): 百公里油耗是500升,MyCar.color) 私有方法 __price_info(): 我的油耗信息是保密的") 请注意:对象不能调用类中无参的方法!!! 对象不能调用类中无参的方法 obj = MyCar() obj.oil_info() 请注意!!!对象不能调用类中无参的方法 注意:对象不能调用类中无参的方法!! 原因:对象在调用方法时,会默认将obj对象作为参数传到类中的无参的方法,进而导致参数数量不一致 ''' 1.定义的类访问公有成员和属性访问公有成员属性 (MyCar.oil) MyCar.__price error # 无法在类外访问私有成员属性 访问公有成员方法 MyCar.oil_info() MyCar.__price_info() error # 无法在类外访问私有成员方法 2.定义的类动态添加公有成员和属性1.添加成员属性 MyCar.color = 红色(MyCar.color) 查看类对象内部成员使用__dict__,返回的是字典 print(MyCar.__dict__) 2.添加成员方法 fangxiangpan(): 改造方向盘的方法) MyCar.fangxiangpan = fangxiangpan MyCar.fangxiangpan() __dict__) 2.有参方法 fadongji(engin): 动力引擎改成{}.format(engin)) MyCar.fadongji = fadongji MyCar.fadongji(三缸发动机 3.lambda 表达式 MyCar.luntai = lambda name : 使用{}的轮胎.format(name)) MyCar.luntai(米其林__dict__) 3.需要注意:类不能反过来调用对象中的成员!!! 3.类和对象之间的差别类和对象之间的区别: 4.如何访问类中的私有成员定义Plane类,并创建如下属性和方法 Plane(): 公有属性 captain = Mike__sistem = 10 公有绑定方法 fly1(self): 我的飞机可以倒着飞1) 公有普通方法 fly2(): 我的飞机可以倒着飞2 私有绑定方法 __fly_info1我的飞机,百公里油耗是5万升1 私有普通方法 __fly_info2 公有绑定方法->间接调用私有成员 pub_info1(self): print(self.__sistem) self.() 公有普通方法->间接调用私有成员 pub_info2(): print(Plane.) Plane.__fly_info2() 关于实现python私有化,有两种方法: 方法一: 关于python私有化的实现方法: 改名策略 _类名 + 私有成员 => 改名策略 方法一.调用私有成员 (不推荐使用改名策略找到私有成员,破坏封装性) 对象调用类中的私有成员 obj = Plane() (obj._Plane__sistem) obj._Plane__fly_info1() 类调用类中的私有成员 (Plane._Plane__sistem) Plane._Plane__fly_info2() __dict__) 方法二: 方法二.类或对象利用公有方法,间接找到私有成员(推荐) obj.pub_info1() Plane.pub_info2() 针对于这个方法,我们可以在类中定义公有绑定方法和公有普通方法间接调用私有成员 公有绑定方法->间接调用私有成员 pub_info1(self): ) self.() 公有普通方法->间接调用私有成员 pub_info2(): ) Plane.__fly_info2() 实例化的对象/定义的类删除公有成员属性和公有成员方法1.公有成员属性 对当前对象添加成员属性交captain obj.captain = 王浩 删除当前对象中的成员属性captain del obj.captain 删除类当中的成员属性captain Plane.captain print(obj.captain) error 无论是类还是对象都没有改属性,所以报错; 2.公有成员方法 Plane.add_sistem = lambda self: 因为业务需要,需要增加乘务员) Plane.add_sistem(1) obj.add_sistem() 删除类中的成员方法 Plane.add_sistem obj.add_sistem() error 发现被删找不到了 obj.chaixie = 我的飞机可以用来拆卸) obj.chaixie() 删除对象中的成员方法 obj.chaixie obj.chaixie() error 最后:对象和类都可以使用__dict__方法查看当前类/对象中的成员 print(obj.__dict__) {} {'__module__': '__main__','_Plane__sistem': 10,'fly1': <function Plane.fly1 at 0x7f26187360d0>,'fly2': <function Plane.fly2 at 0x7f2618736158>,'_Plane__fly_info1': <function Plane.__fly_info1 at 0x7f26187361e0>,'_Plane__fly_info2': <function Plane.__fly_info2 at 0x7f2618736268>,'pub_info1': <function Plane.pub_info1 at 0x7f26187362f0>,'pub_info2': <function Plane.pub_info2 at 0x7f2618736378>,'__dict__': <attribute '__dict__' of 'Plane' objects>,'__weakref__': <attribute '__weakref__' of 'Plane' objects>,'__doc__': None} ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |