1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

      Python面向对象程序设计中类的定义实例化封装及私有变量/方法详解

       更新时间2019年02月28日 11:53:27   作者-牧野-   我要评论

      这篇文章主要介绍了Python面向对象程序设计中类的定义实例化封装及私有变量/方法,结合具体实例形式较为详细的分析了Python面向对象程序设计中类的定义实例化封装私有变量私有方法等相关使用技巧,需要的朋友可以参考下

      本文实例讲述了Python面向对象程序设计中类的定义实例化封装及私有变量/方法分享给大家供大家参考具体如下

      1. 定义类

      python中定义一个类的格式如下

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
        def __func1(self):
          print("MyClass类的私有方法被调用")
        def print_data(self):
          self.__func1()
          print(self.__data1)
          print(self.data2)
        def setData(self,data):
          self.__data1=data
      class1=MyClass('first_data','sencond_data')
      class1.print_data()
      class1._MyClass__func1()
      
      

      类通过关键字 class 引导后跟类的名称通常第一个字母大写类名称MyClass后的括号内的object表示该类的父类如果定义的类没有显明从哪个类继承来的就在括号内使用objectobject类是所有类的父类

      __init__是定义的类的构造函数可以对类的变量进行初始化每?#22791;?#31867;被实例化的时候就会先执行该构造函数

      在类中定义的函数的一个参数一定要是self代表类当前的实例化对象但在调用时不需要传递这个参数

      2. 类的实例

      类的实例化方法如下

      obj=MyClass(x,x)
      
      

      obj是类的实例化对象MyClass是类名括号内的变量是类的初始化变量如果类中有定义的话

      情况一 类的初始属性为空

      class MyClass(object):
        def __init__(self):
          print("MyClass类的构造方法被调用")
      class1=MyClass()
      
      

      情况二 类含有初始属性

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
      class1=MyClass('first_data','sencond_data')
      print(class1.data2)
      
      

      3. 类的封装

      封装继承?#25237;?#24577;是类的三大特征类的封装有?#35762;?#21547;义一个是对数据的封装一个是对实现逻辑即方法的封装

      数据属性的封装

      还看上一个例子

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
      class1=MyClass('first_data','sencond_data')
      print(class1.data2)
      
      

      在这里类MyClass的实例化对象class1就具有了两个属性分别是data1和data2data1是私有属性只能在类内使用data2是公有属性可以在类外使用data1和data2就是对数据属性的封装

      实现逻辑方法的封装

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
        def printMax(self):
          if self.__data1>self.data2:
            print(self.__data1)
          else:
            print(self.data2)
      class1=MyClass(66,88)
      class1.printMax()
      
      

      上边类中的printMax函数实现了比较两个数据大小并打印的功能这个实现逻辑在类外部来说是看不到的只可以调用?#23186;?#21475;相当于一个黑箱子这就是实现逻辑方法的封装

      4. 类的私有属性

      可以在类内定义类的私有属性和方法私有的表明只属于类内部的在类外部是不可以直接访问的python定义私有属性和私有方法的方法是在名称前加上两个下划线 __

      私有属性变量

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
      class1=MyClass(66,88)
      print(class1.data2)
      print(class1.__data1)
      
      

      上例中data2是公有变量可以在类外访问所有calss1.data2没有问题 data1是类的私有属性类外不可以访问使用 class1.__data1会报错 'MyClass' object has no attribute '__data1'

      私有方法

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
        def __func1(self):
          print("MyClass类的私有方法被调用")
        def print_data(self):
          self.__func1()
          print(self.__data1)
          print(self.data2)
      class1=MyClass(66,88)
      class1.print_data()
      #class1.__func1()
      
      

      上例中 print_data方法是类的公有方法可以在类外直接调用 __func1方法是类的私有方法不可以在类外调用但是可以通过类内的print_data方法调用私有的__func1方法即私有的方法可以在类的内部被调用

      5. 类外访问类的私有属性

      类的私有属性保证了外部代码不能随意访问/更改对象内部的数据和方法

      但是对类内私有属性在类外仍然可以通过以下两种 方式进行访问和修改一是通过类内的公有函数修改一是非法修改

      通过类内的公有函数修改

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
        def setData1(self,data):
          self.__data1=data
        def printData1(self):
          print(self.__data1)
      class1=MyClass(66,88)
      class1.setData1(100)
      class1.printData1()
      
      

      非法修改

      python中类的私有属性或方法之所以不能直接从类外部进行访问是因为python解释器把私有的属性或方法 __xx 对外展示成了 _Class__xx即单下划线+类名+__xx 所以如果你执意仍然可以在类外部通过这个改变后的名称非法访问私有属性

      class MyClass(object):
        def __init__(self,data1,data2):
          self.__data1=data1
          self.data2=data2
        def printData1(self):
          print(self.__data1)
      class1=MyClass(66,88)
      print(class1._MyClass__data1)
      
      

      当然一般不建议这么干不同的python编译器可能把私有属性/方法包装成不同的名字

      更多关于Python相关内容?#34892;?#36259;的读者可查看本站专题Python面向对象程序设计入门与进阶教程Python数据结构与算法教程Python函数使用技巧总结Python字符串操作技巧汇总Python编码操作技巧总结Python入门与进阶经典教程

      希望本文所述对大家Python程序设计有所帮助

      相关文章

      最新评论

      3dԻв

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>