• Python 基础之面向对象初识与类的封装


    一.面向对象类的初识

    1.类的定义

    #三种方式:
    #1.
    class MyClass:
        pass

    #2.推荐
    class MyClass():
        pass

    #3.
    class MyClass(object):
        pass

    总结为一句话:class 类名可以不加括号,可以加括号,可以加括号而且括号里面加object。

    2.类的实例化

    class MyClass():
        pass
    #类的实例化,实例化对象
    obj = MyClass()        #obj 就是一个对象

    3.类的基本结构

    只有成员方法和成员属性
    对象.属性  对象.方法()
    #:
    class MyClass():
        #成员属性
        color = "绿色"
        #成员方法
        def pa(self):
            print("我小时候很喜欢爬树")

    obj = MyClass()
    print(obj.color)
    obj.pa()

    '''
    语法允许,大师一定不要这么写,class 和 def 不太一样
    函数在调用时,才会触发里面的代码块
    而类只要执行到这一行,就会触发了
    class MyClass():
        if 5 == 5:
            print(5555)
    '''

    #改造
    class MyClass():
        def func(self):
            if 5 == 5:
                print(555)

    obj = MyClass()
    obj.func()
    #类的命名:
    在对类进行命名的时候,推荐使用大驼峰命名法
    对于类的命名参考变量变量命名方式

     

    二.类的封装性

    公有的,在类可以调用类的相关公有属性
    私有的(前面开头加上__ 两个下划线),在外类不可以调用类内的相关私有属性方法
    绑定方法:
        (1)绑定对象 (默认系统把对象当成参数传递)
        (2)绑定到类 (默认系统把类当成参数传递)
        这两个参数,无论哪种,都是系统自己传递的
        但是参数需要我们自己定义好
    #:
    class Car():
        #公有属性
        logo = "特拉斯"
        color = "绿色"
        #私有属性
        __oil = '2.5L'

        #公有方法
        def run(self):
            print("我的小车跑的快")

        def jiao(self):
            print("我的%s 小车会滴滴的叫" % (self.logo))

        def jiao2(self):
            print("我的%s 小车会滴滴的叫,颜色 %s" % (self.logo,self.color))
         #私有方法
        def __oil_info(self):
            print("这就是我的私有方法")

    #实例化对象
    obj = Car()
    print(obj)

    #对象的相关操作

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

    对象.属性
    对象.方法()
    #(1)调用公有成员属性
    print(obj.logo)
    #print(obj.__oil) #私有的无法在类外调用


    #(2)调用公有成员方法
    系统自己会默认的把obj这个对象当成参数进行传递
    传递给run这个方法,self这个参数进行接收
    obj.run()
    obj.jiao()

    #obj.__oil_info() #error 私有的不能够在进行调用

    2.实例化的对象动态添加公有成员属性

    obj.jiao2()  #输出是绿色
    obj.color = "黄色"
    print(obj.color)
    obj.jiao2()  #现在输出是黄色

    #查看obj 这个对象的内部成员,使用__dic__
    print(obj.__dict__) #只有自定义的

    类中的成员属性和方法可以给对象使用
    但是只有使用权,没有归属权
    类里面的成员属性和方法只对数类所有
    对象只能使用(获取) 不能修改或删除
    不归对象所有

    3.实例化的对象动态添加公有成员方法

    ##(1) 添加无参方法
    def func():
        print("我的汽车会变成,请叫我大黄蜂")

    #把func方法复制给成员方法bianxing
    obj.bianxing = func
    obj.bianxing()
    print(obj.__dict__)

    ##(2)添加有参方法

    def qingtianzhu(name):
        print("请叫我"+name)

    obj.qingtianzhu = qingtianzhu
    obj.qingtianzhu("擎天柱")
    print(obj.__dict__)

    #改造一
    obj.color = "蓝色"
    def qingtianzhu(self,name):
        print("请叫我"+name,"我的颜色是"+self.color)

    obj.qingtianzhu = qingtianzhu
    obj.qingtianzhu(obj,"擎天柱")

    #改造2 把qintianzhu变成绑定 方法(系统帮助我们传递对象)
    import types
    #MehtodType (函数,对象) 要把那个函数作为对象的绑定方法
    obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
    obj.qingtianzhu("擎天柱")

    ##(3)lambda 表达式
    obj.fangxiangpan = lambda : print("我是方向盘的制作方法")
    obj.fangxiangpan()

    三.类的相关操作

    #:

    class MyCar():
        oil = "涡轮增压发动机1.5T"
        __price = "100万"

        #公有普通方法(只能类来调用)
        def oil_info():
            #类.oil
            print("我的油耗信息:"+MyCar.oil)

        #私有普通方法
        def __price_info():
            print("我的价格是保密")

    #obj = MyCar()
    #obj.oil_info() 对象调用不了

    1.定义的类访问公有成员属性和方法

    .成员属性
    .成员方法()
    无论是私有属性还是方法都无法在类外调用

    print(MyCar.oil)
    MyCar.oil_info()
    #MyCar.__price_info() error 无法使用类来调用私有成员

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

    #公有属性
    MyCar.logo = "中国一汽"
    print(MyCar.logo)

    #使用__dict__查看类内的成员
    print(MyCar.__dict__)

    #公有方法
    ##(1)无参方法
    def dahuangfeng():
        print("请叫我大黄蜂")

    MyCar.dahuangfeng = dahuangfeng
    MyCar.dahuangfeng()

    ##(2)有参方法
    def qingtianzhu(name):
        print("请叫我"+name)

    MyCar.qingtianzhu = qingtianzhu
    MyCar.qingtianzhu("一柱擎天")

    ##(3)lambda 表达式
    MyCar.dog = lambda : print("我的车还会变成机器狗")
    MyCar.dog()

     3.如何访问私有成员

    #:

    class Plane():
        #公有属性
        captain = "peter"
        #私有属性
        __air_sister = "20个"
        #公有绑定方法
        def fly1(self):
            print("飞机会飞1")
        #公有普通方法
        def fly2():
            print("飞机会飞2")
        #私有的绑定方法
        def __oil_info1(self):
            print("飞机百公里油耗是10升1")
        #私有的普通方法
        def __oil_info2():
            print("飞机百公里油耗是10升2")
        #公有的绑定方法
        def pub_info1(self):
            print(self.__air_sister)
            self.__oil_info1()
            print(self.captain)
        #公有的普通方法
        def pub_info2():
            print(Plane.__air_sister)
            Plane.__oil_info2()

    ##(1)如何访问类的私有成员?
    利用公有方法调用类内的私有成员
    私有成员在本类之内可以随便调用,在本类之外不能调用
    #实例化对象 方法一
    obj = Plane()
    obj.pub_info1()
    #也可以使用类来调用  方法二
    Plane.pub_info2()

    ##(2)如果就想直接在类外调用私有成员,有方法吗
    私有成员的改名策略:
    _类名+私有成员 (没有真正的私有化,类外可以通过改名策略仍然调取)

    print("========")
    print(obj._Plane__air_sister)
    Plane._Plane__oil_info2()

    ##(3)如何删除成员
    # (1) 实例化的对象删除公有成员属性和方法
    obj = Plane()
    print(obj.__dict__)
    print(obj.captain)

    captain 成员属性归属于class Plane,不是obj
    obj 可以有使用权,没有所有权(不能够修改或者删除类内的属性)
    如果对象有该属性方法,先优先调用该对象里面的成员
    如果都没有.直接报错
    #删除对象属性
    obj.captain = "JIAN"
    print(obj.__dict__)
    print(obj.captain)

    del obj.captain
    print(obj.captain) #obj自己的captain 被删除了
    #obj.pub_info1() 里面的peter还在

    #删除对象的方法
    print("==========")
    obj.fly222 = lambda : print("我的飞机能潜水")
    obj.fly222()
    print(obj.__dict__)
    # del obj.fly
    # print(obj.__dict__)

    ##(2)定义的类删除公有成员属性和方法
    对象可以调用类中的公有成员和方法
    类不能调用对象的相关成员属性和方法
    方向不可逆
    一个类可以产生多个对象,多个对象彼此之间,相互独立

    #删除类的成员属性
    # del Plane.captain
    # print(Plane.captain)
    # print(obj.captain)
    # Plane.fly111222() error  类不能调用对象的方法

    # 删除类的成员方法
    del Plane.pub_info1
    # Plane.pub_info1() error  不存在

     

     

     

  • 相关阅读:
    错误代码 0x800700b7 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler”节
    字符型设备驱动程序-first-printf以及点亮LED灯(一)
    翻译 TI SerialBLEbridge V 1.4.1
    lwip TCP client & FreeRTOS 打开TCP 的 保活机制 LWIP_TCP_KEEPALIVE==1
    lwip TCP client 客户端 & FreeRTOS
    CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)
    跟我一起学Linux-线程创建,类似FreeRTOS创建任务
    用 S5PV210 学习 Linux (三) SD卡下载
    用 S5PV210 学习 Linux (二) 刷机(二)
    用 S5PV210 学习 Linux (一) 刷机(一)
  • 原文地址:https://www.cnblogs.com/hszstudypy/p/10925495.html
Copyright © 2020-2023  润新知