zoukankan      html  css  js  c++  java
  • 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表示该类的父类,如果定义的类没有显明从哪个类继承来的,就在括号内使用object,object类是所有类的父类。

    __init__是定义的类的构造函数,可以对类的变量进行初始化,每当该类被实例化的时候,就会先执行该构造函数。

    在类中定义的函数的一个参数一定要是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. 类的封装


    封装、继承和多态是类的三大特征。类的封装有两层含义,一个是对数据的封装,一个是对实现逻辑即方法的封装。


    数据(属性)的封装


    还看上一个例子:

    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和data2,data1是私有属性,只能在类内使用,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函数实现了比较两个数据大小并打印的功能,这个实现逻辑在类外部来说是看不到的,只可以调用该接口,相当于一个黑箱子,这就是实现逻辑(方法)的封装。


    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编译器可能把私有属性/方法包装成不同的名字。


  • 相关阅读:
    理解 Delphi 的类(十) 深入方法[15] 调用其他单元的函数
    理解 Delphi 的类(十) 深入方法[13] 在 interface 区声明的方法
    理解 Delphi 的类(十) 深入方法[12] implementation 区中的方法
    理解 Delphi 的类(十) 深入方法[6] Result
    什么是B*树倒排索引技术 已解决 搜搜问问
    caoruntao的博客 数据结构及算法分类文章列表 ITeye技术网站
    PForDelta索引压缩算法的实现
    计算机词汇(融合了搜狗所有的计算机词库)_搜狗输入法词库
    一种由B+树实现的倒排索引《电脑知识与技术》2011年08期
    海量数据处理专题(九)——外排序
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411836.html
Copyright © 2011-2022 走看看