• day22 面向对象的程序开发、面相对象-封装、面向对象0-类操作、面向对象删除操作


    # ### opp 面向对象

    类的定义

    class MyClass:	
    	pass
    	
    class MyClass(): #(推荐)
    	pass
    	
    class MyClass(object):
    	pass
    

    类的实例化

    class MyCar():
    	color = "黄色的"
    	 
    # 实例化对象 (类的实例化)
    obj = MyCar() # object -> obj
    
    类的基本结构
    """
    1.成员属性
    2.成员方法
    """
    class MyCar():
    	# 成员属性
    	color = "天蓝色的"
    	# 成员方法
    	def didi():
    		print("小车会滴滴叫")
    	
    # 反例: 这种写法可以直接在python当中执行,但是严禁使用
    # 如果想要表达逻辑或者循环,需要写在成员方法当中,不能直接裸露的写在类当中,会破坏类中结构.
    """
    class MyCar():
    	if 5 == 5:
    		print("打印成功123456")
    """
    
    类的命名
    驼峰命名法 : 推荐起类名的时候,使用大驼峰命名法.
    # mycar -> MyCar mymouse => MyMouse

    # ### oop 面向对象 -- 封装

    """

    封装等级:

     (1)私有:在类的内部可以访问,在类外不可以

     (2)公有:在类的内部可以访问,在类外也可以访问

    封装成员:

      (1)成员属性

      (2)成员方法

    调用成员:

      (1)对象.成员属性

      (2)对象.成员方法

    绑定方法:

      (1)绑定到对象:对象调用方法时,系统自己默认传递改对象,作为一个参数传递到当前方法中

      (2)绑定到类   :对象或者类调用方法时,系统自己默认传递该类,作为一个参数传递到当前方法中

    """

    class MyCar():
        # 公有成员属性
        color = "屎黄色"
        logo = "中国吉利汽车"
    
        # 私有成员属性
        __price = "2000万"
    
        # 公有成员方法
        def run(self):
            print("小车会跑,百公里0.01秒,颜色{}".format(self.color))    # self <==> obj
    
        # 私有成员方法    
        def __info(self):
            print("车主信息是保密的,传说是京城有名的富二代")
    

    实例化对象(类的实例化)

    obj= MyCar()
    

    (1) 实例化的对象访问公有成员属性和方法

      访问属性

    print(obj.color)
    # obj.__price error  # 私有成员属性不能够在类外调用
    

      访问方法

    obj.run()
    # obj.__info() erroe # 私有成员方法不能够在类外调用
    

      

    (2)实例化的对象动态添加公有成员属性和方法

      在类外动态添加成员属性 -> obj对象

    obj.logo = "五菱宏光"
    print(obj.logo)
    __dict__是获取类对象中的成员
    print(obj.__dict__)
    

      在类外动态添加成员方法 -> obj对象

      1.无参方法

    def dahuangfeng()
        print("变形!我是大黄蜂~")
    
    obj.dahuangfeng = dahuangfeng
    obj.dahuangfeng()
    

      2.有参方法

    # 1.基础版
    def qingtianzhu(name):
    	print("请我叫我一柱擎天,简称{}".format(name))
    
    obj.qingtianzhu = qingtianzhu
    obj.qingtianzhu("擎天柱")
    	
    # 2.升级版
    def qingtianzhu(obj,name):
    	print("请我叫我一柱擎天,简称{},颜色是{}".format(name,obj.color))
    obj.qingtianzhu = qingtianzhu
    obj.qingtianzhu(obj,"擎天柱")
    
    # 3.究极版 (即使调用类外动态创建的方法,也让系统自己传递obj对象本身)
    import types
    def qingtianzhu(obj,name):
    	print("请我叫我一柱擎天,简称{},颜色是{}".format(name,obj.color))
    # MethodType(方法,对象) 把哪个方法和哪个对象绑定到一起,形成绑定方法
    obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
    obj.qingtianzhu("擎天柱")
    


    lambda表达式

    obj.weizhentian = lambda:print("我是威震天~")
    obj.weizhentian()
    

      

    # ### oop 面向对象封装 -- 类的相关操作

    """
    类调用的方式:
    类.成员属性
    类.成员方法
    类中的无参方法只能是类来调用.
    """
    class MyCar():
    	# 公有属性
    	oil = "2.0T"
    	# 私有属性
    	__price = "5000千万"
    	# 公有方法
    	def oil_info():
    		print("百公里油耗是500升",MyCar.color)
    	# 私有方法
    	def __price_info():
    		print("我的油耗信息是保密的")
    

      

    实例化对象
    """
    # 对象不能调用类中无参的方法
    obj = MyCar()
    obj.oil_info()
    """
    定义的类访问公有成员属性和方法
    访问公有成员属性
    print(MyCar.oil)
    MyCar.__price     error # 无法在类外访问私有成员属性 
    访问公有成员方法
    
    
    MyCar.oil_info()
    MyCar.__price_info() error # 无法在类外访问私有成员方法
    
    
    

     

    定义的类动态添加公有成员属性和方法 

    添加成员属性
    MyCar.color = "屎绿色"
    print(MyCar.color)
    # 查看类对象内部成员使用__dict__,返回的是字典
    print(MyCar.__dict__)
    # MyCar.oil_info()
    """
    {'__module__': '__main__', 
    'oil': '2.0T', 
    '_MyCar__price': '5000千万', 
    'oil_info': <function MyCar.oil_info at 0x7f3f9668b0d0>, 
    '_MyCar__price_info': <function MyCar.__price_info at 0x7f3f9668b158>, 
    '__dict__': <attribute '__dict__' of 'MyCar' objects>, 
    '__weakref__': <attribute '__weakref__' of 'MyCar' objects>, 
    '__doc__': None, 
    'color': '屎绿色'
    }
    """
    

     添加成员方法 

    1.无参方法
    def fangxiangpan():
    	print("改造方向盘的方法")
    MyCar.fangxiangpan = fangxiangpan
    MyCar.fangxiangpan()
    
    print(MyCar.__dict__)
    2.有参方法
    def fadongji(engin):
    	print("动力引擎改成{}".format(engin))
    MyCar.fadongji = fadongji
    MyCar.fadongji("三缸发动机") 
    3.lambda 表达式
    MyCar.luntai = lambda name : print("使用{}的轮胎".format(name))
    MyCar.luntai("米其林")
    
    print(MyCar.__dict__)
    
    
    obj = MyCar()
    # obj.logo = "柯尼塞格"
    # print(MyCar.logo) error 类不能返回来调用对象中的成员
    
    """
    # 类和对象之间的区别
    对象可以调用类中的成员属性和方法,返过来,类不能调用对象中的成员.
    类中的成员属性和方法归属于类本身,对象可以使用,但是没有修改和删除的权利.
    对象在调用相应成员时,先看看自己有没有
    如果有,调用自己的
    如果没有,调用类中的成员
    如果类中成员也没有,直接报错.
    """
    MyCar.logo = "别摸我,我是宝马bwm"
    obj.logo = "柯尼塞格"
    print(obj.__dict__)
    print(obj.logo)
    

      

    
    

    # ### 一.如何访问类中的私有成员

    # ### 一.如何访问类中的私有成员
    class Plane():
    	# 公有属性
    	captain = "宋云杰"
    	# 私有属性
    	__sistem = 10
    	
    	# 公有绑定方法
    	def fly1(self):
    		print("我的飞机可以倒着飞1")
    		
    	# 公有普通方法
    	def fly2():
    		print("我的飞机可以倒着飞2")
    		
    	# 私有绑定方法
    	def __fly_info1(self):
    		print("我的飞机,百公里油耗是5万升1")
    		
    	# 私有普通方法
    	def __fly_info2():
    		print("我的飞机,百公里油耗是5万升2")
    		
    	# 公有绑定方法->间接调用私有成员
    	def pub_info1(self):
    		print(self.__sistem)
    		self.__fly_info1()
    		
    	# 公有普通方法->间接调用私有成员
    	def pub_info2():
    		print(Plane.__sistem)
    		Plane.__fly_info2()
    '''
    关于python私有化的实现方法: 改名策略
    _类名 + 私有成员 => 改名策略
    '''
    # 方法一.调用私有成员 (不推荐使用改名策略找到私有成员,破坏封装性)
    # 对象调用类中的私有成员
    obj = Plane()
    print(obj._Plane__sistem)
    obj._Plane__fly_info1()
    
    # 类调用类中的私有成员
    print(Plane._Plane__sistem)
    Plane._Plane__fly_info2()
    print(Plane.__dict__)
    
    # 方法二.类或对象利用公有方法,间接找到私有成员(推荐)
    obj.pub_info1()
    Plane.pub_info2()
    
    
    # ### 二.实例化的对象/定义的类 删除公有成员属性 和 公有成员方法
    print(obj.__dict__)
    
    # 1.公有成员属性
    # 对当前对象添加成员属性交captain
    obj.captain = "王浩"
    # 删除当前对象中的成员属性captain
    del obj.captain
    # 删除类当中的成员属性captain
    del Plane.captain
    # 无论是类还是对象都没有改属性,所以报错;
    # print(obj.captain) error
    
    # 2.公有成员方法
    Plane.add_sistem = lambda self: print("因为业务需要,需要增加空姐","<====>")
    
    # del Plane.add_sistem
    Plane.add_sistem(1)
    obj.add_sistem()
    # 删除类中的成员方法
    del Plane.add_sistem
    # obj.add_sistem() error 发现被删找不到了
    
    obj.paoniu = lambda : print("我的飞机可以用来泡妞")
    obj.paoniu()
    # 删除对象中的成员方法
    del obj.paoniu
    # obj.paoniu() error
    
    print(obj.__dict__) # {}
    print(Plane.__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}
    

      

     
     
    
    
  • 相关阅读:
    HDU 1175 连连看 (DFS+剪枝)
    CF702F T-Shirts
    UVA12538 Version Controlled IDE
    P2605 [ZJOI2010]基站选址
    P3835 【模板】可持久化平衡树
    CF915E Physical Education Lessons
    P3701 「伪模板」主席树
    P1198 [JSOI2008]最大数
    P3466 [POI2008]KLO-Building blocks
    P3919 【模板】可持久化数组(可持久化线段树/平衡树)
  • 原文地址:https://www.cnblogs.com/liya1014/p/13430636.html
Copyright © 2020-2023  润新知