[python] 私有变量和私有方法

图片 5
aa = A()
print aa.__mingzi




Traceback (most recent call last):
  File "E:4.scriptworktest.py", line 21, in <module>
    print aa.__mingzi
AttributeError: 'A' object has no attribute '__mingzi'

可以看出stu1和stu2的引用数量是相同的,由于删除stu1后,系统找不到所以会报错,而删除stu1对stu2没有影响,所以引用数量为2。

 

print(‘__init__’)

1、在Python中要想定义的方法或者变量只在类内部使用不被外部调用,可以在方法和变量前面加 两个 下划线

另一种是    对象名.方法名()    —–   间接修改

aa = A()
print aa._A__mingzi    # A前面只有一个下线线
print aa._A__fun2()



bingyishuangsa
This is private method

图片 1

但是可以通过下面这种方法去引用私有变量和方法,在类名前面添加一个下划线

class Student:

输出:

一种是      对象名.属性=数据   —–   直接修改

 

如果改为获取stu2的引用数量,删除stu1后,那结果为

sashuangyibing
bingyishuangsa
bingyishuangsa
This is private method

错误显示没有这个属性。

  

import sys

  

图片 2

aa = A()
print aa.__fun2()




Traceback (most recent call last):
  File "E:4.scriptworktest.py", line 21, in <module>
    print aa.__fun2()
AttributeError: 'A' object has no attribute '__fun2'

Python中没有像C++中public和private这些关键字来区别公有属性和私有属性。它是以属性命名方式来区分,如果在属性名前面加了2个下划线’__’,则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。

 1 #-*-  coding:utf-8 -*-
 2 
 3 class A(object):
 4     name = "sashuangyibing"
 5     __mingzi = "bingyishuangsa"    # 这个是私有变量,只能在类A之内可以使用,超过类A之外是无法引用到
 6     def fun1(self):
 7         print "This is common method"
 8     def __fun2(self):   # 这个是私有方法,只能在类A之内可以使用,超过类A之外是无法引用到
 9         print "This is private method"
10     def fun4(self):
11         return self.__mingzi    # 该私有变量在当前类之内可以被引用
12 
13 class B(A):
14     def __init__(self):
15         super(B,self).__init__()
16     
17     def fun3(self):
18         print "fun3"
19         
20 aa = A()
21 print aa.name
22 print aa.fun4()
23 print aa._A__mingzi
24 aa._A__fun2()

图片 3

 

print(‘__del__’)

  

运行结果显示为

试错验证,如果按下面方法织造引用私有变量,会报没有该属性

图片 4

图片 5

del stu1

self.__name=name

如果一个对象需要对其属性进行修改时,有两种方法:

stu2=stu1

解决办法:

stu1=Student(‘Tony’)

#获取对象的引用数量,多一个

也就是说当有一个变量保存了对象的引用后,此对象的引用就会加1。当使用del删除变量指向的对象时,如果对象的引用计数不为1,则减1,调用引用计数被删除的变量时会报错,而调用未被删除的变量时依然显示删除完之后的结果。

定义了一个烤的类。初始化默认为烤了0分钟,烤的情况是生的,调料列表也是空的。对象转化为字符串时输出烤地瓜的时间,烤的情况,以及加入的调料。定义一个烤的方法,根据对象传递的时间判断烤的情况。如果烤熟了,则调用添加调料addcondiments()的方法添加调料。创建一个digua1的对象来测试输出。结果如下:

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图