您的位置:澳门新葡8455最新网站 > 编程教学 > 读书笔记,类民用成员和护卫成员

读书笔记,类民用成员和护卫成员

发布时间:2019-11-04 10:57编辑:编程教学浏览(57)

    python中的protected和private

    python中用

    _var ;变量名前三个下划线来定义,此变量为保险成员protected,唯有类及其子类可以访谈。此变量无法因而from XXX import xxx 导入

    __var;变量名前三个下划线来定义,此变量为私有private,只允许类本身访谈,连子类都不得以访问。

     

    class perent_class(object):
        def __init__(self,name,protected,private):
            self.name = name
            self._protected = protected
            self.__private = private
    

     

    Linux and python学习交流1,2群已满.

    Linux and python学习交流3群新开,迎接参预,一同学习.qq 3群:563227894

    不前行,不倒退,停止的情状是绝非的.

    联合前进,与君共勉,

     

    四星期贰次课(十一月7日卡塔尔

    大器晚成、 类的重写

    1.1 重写平时方法

    class A:
        def hello(self):
            print('Hello,i am A.')
    class B(A):
        pass
    a = A()
    b = B()
    a.hello()
    b.hello()
    

    结果:

    Hello,i am A.
    Hello,i am A.
    

    解释:

    B类未有概念自个儿的hello方法,故当hello被调用时,原始消息就被打字与印刷出来了。

    B类也得以重写那么些hello方法

    class A:
        def hello(self):
            print('Hello,i am A.')
    class B(A):
        def hello(self):  
            print('Hello,i am B.')
    a = A()
    b = B()
    a.hello()
    b.hello()
    

    结果:

    Hello,i am A.
    Hello,i am B.
    

    1.2 重写特殊的构造方法

    1、调用未绑定的基类构造方法

    class Bird:
        def __init__(self):
            self.hungry = True
        def eat(self):
            if self.hungry:
                print('Aaaah...')
                self.hungry = False
            else:
                print('No,thanks!')
    class SongBird(Bird):
        def __init__(self):
                Bird.__init__(self)
                self.sound = 'Squawk!'
        def sing(self):
            print(self.sound)
    b = SongBird()
    b.sing()
    b.eat()
    b.eat()
    

    结果:

    Squawk!
    Aaaah...
    No,thanks!
    

    2、使用super函数

    class Bird():
        def __init__(self):
            self.hungry = True
        def eat(self):
            if self.hungry:
                print('Aaaah...')
                self.hungry = False
            else:
                print('No,thanks!')
    class SongBird(Bird):
        def __init__(self):
            super(SongBird,self).__init__()
            self.sound = 'Squawk!'
        def sing(self):
            print(self.sound)
    b = SongBird()
    b.sing()
    b.eat()
    b.eat()
    

    结果:

    Squawk!
    Aaaah...
    No,thanks!
    

    解释:

    Python 第22中学定义类须要写上object,不然报错。

    二、类的民用变量

    在Python中能够通过在性质变量名前充足双下划线定义属性为私有品质

    独特变量命名

    1、 _xx 以单下划线以前的意味的是protected类型的变量。即爱惜品种只可以同意其本身与子类进行访谈。若在那之中变量标示,如: 当使用“from M import”时,不会将以叁个下划线起头的目的引入 。

    2、 __xx 双下划线的象征的是个人类型的变量。只好同意这几个类本身举办拜访了,连子类也无法用于命名三个类属性(类变量卡塔尔国,调用时名字被更正(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

    3、 __xx__概念的是不一致平时格局。顾客调控的命名空间内的变量或是属性,如init , __import__或然file 。唯有当文书档案有表达时选择,不要本身定义那类变量。 (正是说那一个是python内部定义的变量名卡塔尔国

    在此重申说一下私有变量,python暗中认可的积极分子函数和成员变量都以公开的,未有像其他相仿语言的public,private等根本字修饰.不过能够在变量前面加上多少个下划线"_",那样的话函数或变量就产生私有的.那是python的民用变量轧压(这一个翻译好拗口),匈牙利(Hungary卡塔 尔(阿拉伯语:قطر‎语是(private name mangling.) **状态正是当变量被标志为私有后,在变量的前端插入类名,再类名前增加三个下划线"_",即形成了_ClassName__变量名.**

    Python内置类属性

    __dict__ : 类的属性(包括三个字典,由类的多寡属性组成卡塔 尔(英语:State of Qatar)

    __doc__ :类的文书档案字符串

    __module__: 类定义所在的模块(类的全名是'__main__.className',如若类位居四个导入模块mymod中,那么className.__module__ 等于 mymod)

    __bases__ : 类的具有父类构成因素(包涵了叁个由全体父类组成的元组卡塔尔

    例子1:

    class A(object):
        def __init__(self):
            self.__data = []  # 翻译成 self._A__data=[]
    
        def add(self, item):
            self.__data.append(item)  # 翻译成 self._A__data.append(item)
    
        def printData(self):
            print self.__data  # 翻译成 self._A__data
    
    
    a = A()
    a.add('hello')
    a.add('python')
    a.printData()
    # print a.__data  #外界不能访问私有变量 AttributeError: 'A' object has no attribute '__data'
    print a._A__data  # 通过这种方式,在外面也能够访问“私有”变量;这一点在调试中是比较有用的!
    

    结果:

    ['hello', 'python']
    ['hello', 'python']
    

    例子2:

    class A():
        def __init__(self):
            self.__name = 'python'  # 私有变量,翻译成 self._A__name='python'
    
        def __say(self):  # 私有方法,翻译成 def _A__say(self)
            print self.__name  # 翻译成 self._A__name
    
    
    a = A()
    # print a.__name #访问私有属性,报错!AttributeError: A instance has no attribute '__name'
    print a.__dict__  # 查询出实例a的属性的集合
    print a._A__name  # 这样,就可以访问私有变量了
    # a.__say()#调用私有方法,报错。AttributeError: A instance has no attribute '__say'
    print dir(a)  # 获取实例的所有属性和方法
    a._A__say()  # 这样,就可以调用私有方法了
    

    结果:

    {'_A__name': 'python'}
    python
    ['_A__name', '_A__say', '__doc__', '__init__', '__module__']
    python
    

    本文由澳门新葡8455最新网站发布于编程教学,转载请注明出处:读书笔记,类民用成员和护卫成员

    关键词:

上一篇:没有了

下一篇:没有了