金沙js333娱乐场读书笔记(七月01二十二十日)–类

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

不前进,不倒退,停止的状态是没有的.

一起进步,与君共勉,

 

结果:

金沙js333娱乐场 ,因为异常也是一个类,所以遵守类的命名规则。此外,如果异常实际上指代一个错误的话,应该使用“Error”做后缀。

四周二次课(11月7日)

文件名:

B类也可以重写这个hello方法

this_is_a_var

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

以__开头(2个下划线),其他和普通函数一样

结果:

几乎毫无例外的,类名都使用首字母大写开头(Pascal命名风格)的规范。使用_单下划线开头的类名为内部使用,from
M import *默认不被导入的情况。

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()

模块名:

二、类的私有变量

和模块名一样

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()  # 这样,就可以调用私有方法了

以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from
xxx import
*”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表python里特殊方法专用的标识,如__init__()代表类的构造函数。

例子1:

普通变量:

在Python中可以通过在属性变量名前加上双下划线定义属性为私有属性

以_开头,其他和普通变量一样

2、 __xx
双下划线的表示的是私有类型的变量。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)

__doc__

例子2:

self.__id__ = id

1、 _xx
以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如:
当使用“from M import”时,不会将以一个下划线开头的对象引入 。

主要是指 __xxx__
形式的系统保留字命名法。项目中也可以使用这种命名,它的意义在于这种形式的变量是只读的,这种形式的类成员函数尽量不要重载。如

一、 类的重写

2.命名中含有长单词,对某个单词进行缩写。这时应使用约定成俗的缩写方式。

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

单下划线结尾_:只是为了避免与python关键字的命名冲突

2、使用super函数

*注意*:混合大小写仅被允许用于这种风格已经占据优势的时候,以便保持向后兼容。

3、
__xx__定义的是特殊方法。用户控制的命名空间内的变量或是属性,如init ,
__import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。
(就是说这些是python内部定义的变量名)

*注意*:

结果:

特定命名方式

解释:

def __message__(self, msgid):

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

2.私有类成员使用单一下划线前缀标识,多定义公开成员,少定义私有成员。

Python内置类属性

以__开头(2个下划线),其他和普通变量一样

Python
2中定义类需要写上object,否则报错。

# …略
其中 __id__、__parent__ 和 __message__
都采用了系统保留字命名法。

解释:

主要是考虑模块名是与文件夹相对应的,因此需要考虑文件系统的一些命名规则的,比如Unix系统对大小写敏感,而过长的文件名会影响其在Windows\Mac\Dos等系统中的正常使用。

Squawk!
Aaaah...
No,thanks!

_instance_var

Squawk!
Aaaah...
No,thanks!

“双下划线”
开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

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  # 通过这种方式,在外面也能够访问“私有”变量;这一点在调试中是比较有用的!

class Base(object):

在这里强调说一下私有变量,python默认的成员函数和成员变量都是公开的,没有像其他类似语言的public,private等关键字修饰.但是可以在变量前面加上两个下划线”_”,这样的话函数或变量就变成私有的.这是python的私有变量轧压(这个翻译好拗口),英文是(private
name mangling.)
**情况就是当变量被标记为私有后,在变量的前端插入类名,再类名前添加一个下划线”_”,即形成了_ClassName__变量名.**

两个前导下划线:当命名一个类属性引起名称冲突时使用。

1.2 重写特殊的构造方法

命名应当尽量使用全拼写的单词,缩写的情况有如下两种:

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

专有变量:

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()

和普通变量一样:

发表评论

电子邮件地址不会被公开。 必填项已用*标注