个人变量和个人方法

ca88会员登录中心 16
ca88会员登录中心

一、在Python中要想定义的方法或然变量只在类内部使用不被表面调用,能够在点子和变量后边加 两个 下划线

为了强化对面向对象的领会,看下边包车型客车代码

 

ca88会员登录中心 1

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

ca88会员登录中心 2

输出:

概念了二个烤的类。起首化默感觉烤了0分钟,烤的处境是生的,调料列表也是空的。对象转化为字符串时输出烤沙葛的时日,烤的情状,以及参与的调味品。定义3个烤的点子,遵照目标传递的光阴决断烤的场地。假如烤熟了,则调用增加调料addcondiments()的章程增多调料。成立三个digua一的对象来测试输出。结果如下:

sashuangyibing
bingyishuangsa
bingyishuangsa
This is private method

ca88会员登录中心 3

 

接下去,涉及到目的的传递,先举办3个总结的事例:

试错验证,假使按上边方法织造引用私有变量,会报未有该属性

ca88会员登录中心 4

aa = A()
print aa.__mingzi




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

ca88会员登录中心 5

  

在调用a.test(b)那么些办法时,item同时针对了b指向的地方,所以对item.num重新复制,也就同时改造了b的值。所以出现了上海教室所示的结果。那正是目的的传递。

aa = A()
print aa.__fun2()




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

上面将测试一下对象的传递

  

ca88会员登录中心 6

唯独足以因而上边那种形式去引用私有变量和方法,在类名前边加多2个下划线

ca88会员登录中心 7

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



bingyishuangsa
This is private method

ca88会员登录中心 8

  

也等于说要是一个对象与另3个对象有早晚的关联,那么三个目的足以用另二个对象的性质。

 

保卫安全对象的特性

假如一个目标急需对其质量进行改变时,有二种方法:

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

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

为了越来越好的保险属性的平安,不提议选取第二种格局,一般管理的不贰诀固然将品质定义为私有品质,增添一个能够调用的方法,供调用。

ca88会员登录中心 9

ca88会员登录中心 10

谬误展现未有那天性格。

消除办法:

ca88会员登录中心 11

ca88会员登录中心 12

能够通过调用方法访问到属性,因而得以在措施里设置约束原则举行决断

ca88会员登录中心 13

ca88会员登录中心 14

Python中从不像C++中public和private那几个重大字来分别公有属性和个体属性。它是以属性命有名的模特式来区分,要是在属性名后面加了二个下划线’__ca88会员登录中心,’,则注明该属性是私家属性,不然为国有属性(方法也是如出1辙,方法名后面加了三个下划线的话代表该格局是私有的,不然为国有的)。

创立对象后,python解释器暗中认可调用__init__()方法;当删除一个目标时,python解释器也会暗许调用贰个方法,这些点子为__del__()方法。__del__()会在对象被垃圾回收时被调用,该情势能够自由能源,举例文件的一而再,数据库的连天等。

import sys

class Student:

def __init__(self,name):

print(‘__init__’)

self.__name=name

def __del__(self):

print(‘__del__’)

stu1=Student(‘Tony’)

stu2=stu1

#获得对象的引用数量,多二个

print(sys.getrefcount(stu1))

del stu1

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

print(sys.getrefcount(stu1))

运转结果展现为

ca88会员登录中心 15

如果改为博得stu二的引用数量,删除stu一后,那结果为

ca88会员登录中心 16

能够看出stu一和stu二的引用数量是同一的,由于删除stu一后,系统找不到所以会报错,而删除stu壹对stu2尚无影响,所以引用数量为贰。

也正是说当有贰个变量保存了对象的引用后,此目标的引用就会加一。当使用del删除变量指向的对象时,假使目的的引用计数不为一,则减一,调用引用计数被剔除的变量时会报错,而调用未被去除的变量时依然显得删除完以往的结果。

发表评论

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

网站地图xml地图