博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day 3 私有属性,私有方法,__del__
阅读量:5246 次
发布时间:2019-06-14

本文共 3587 字,大约阅读时间需要 11 分钟。

1.隐藏对象的属性

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

  • 对象名.属性名 = 数据 ---->直接修改
  • 对象名.方法名() ---->间接修改

  1)版本1:直接修改 对象的属性

class Dog:     '''定义Dog类'''     pass  #创建一个对象 dog1 = Dog() dog1.age = 10 print(dog1.age)

  2)版本2:通过方法,修改 对象的属性

class Dog:     '''定义Dog类'''     def set_age(self,new_age):         self.age = new_age      def get_age(self):         return self.age  dog1 = Dog() #dog1.age = -10 #print(dog1.age) dog1.set_age(10) print(dog1.get_age())

  

 

  3)版本3:方法里面可以判断

class Dog:     '''定义Dog类'''     def set_age(self,new_age):         if new_age >0 and new_age <100:             self.age = new_age         else:             self.age = 0      def get_age(self):         return self.age  dog1 = Dog() #dog1.age = -10 #print(dog1.age) dog1.set_age(-10) print(dog1.get_age())

 

2.私有属性??? self.__age = 0 

  它是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性

为了更好的保存属性安全,即不能随意修改,一般的处理方式为

  • 将属性定义为私有属性
  • 添加一个可以调用的方法,供调用
class Dog:     '''定义Dog类'''     def __init__(self,new_name):         self.name = new_name         self.__age = 0  #定义了一个私有的属性,属性的名字是__age      def set_age(self,new_age):         if new_age >0 and new_age <100:             self.__age  = new_age         else:             self.__age  = 0      def get_age(self):         return self.__age  dog1 = Dog("tom") #dog1.age = -10 #print(dog1.age) dog1.set_age(-10) print(dog1.get_age()) print(dog1.__age)
0                                                       #可以通过公有方法调用私有属性Traceback (most recent call last):  File "02-隐藏对象的属性-私有属性.py", line 21, in 
print(dog1.__age)AttributeError: 'Dog' object has no attribute '__age' #私有属性不能调用

 

#可以通过公有方法调用私有属性
#私有属性不能直接调用

 

3.私有方法  def __test1(self):

方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的

class Dog:      def test1(self):         print("----")     def test2(self):         print("#####")   dog = Dog() dog.test1() dog.test2()#### 运行结果----#####

  2)版本2:

#### 私有方法class Dog:    #私有方法    def __test1(self):        print("----")    def test2(self):        print("#####")dog = Dog()dog.test1()dog.test2()Traceback (most recent call last):  File "03-私有方法.py", line 11, in 
dog.test1()AttributeError: 'Dog' object has no attribute 'test1' #私有方法不能调用

  3)版本3

    实际开发: 先调用公有方法,然进行判断,符合条件,才能调用私有方法
class Dog:    #私有方法    def __send_msg(self):        print("正在发送短信。。")     #公有方法    def send_msg(self,money):        if money > 10000:            self.__send_msg()        else:            print("余额不足,请充值")dog = Dog()dog.send_msg(1000000)    

      

 

4.__del__ 方法 : 对象死亡时自动调用

  1)版本1:程序自动退出,释放内存

class Dog:      def __del__(self):         print("----英雄over---")  dog1 = Dog() dog2 = dog1  del dog1  print("======")#### 运行结果======----英雄over---            #程序退出,释放内存,自动执行del方法

  2)版本2:对象没有人要调用,回收对象内存,自动执行

class Dog:      def __del__(self):         print("----英雄over---")  dog1 = Dog() dog2 = dog1  del dog1 #不会调用__del__方法,因为这个对象 还有其他的变量指向它,即引用计算不是0 del dog2 #此时会调用__del__方法,因为没有变量指向它了 print("======")  #如果在程序结束时,有些对象还存在,那么python解释器会自动调用他们的__del__方法来完成清理工作
#####运行结果‘’ ----英雄over--- ======

     

 

5.测量一个对象的引用计数方式

In [1]: import sysIn [2]: #sys.getrefcount()In [3]: class T:   ...:     pass   ...: In [4]: t = T()In [5]: sys.getrefcount(t)Out[5]: 2In [6]: tt = tIn [7]: sys.getrefcount(t)Out[7]: 3In [8]: del ttIn [9]: sys.getrefcount(t)Out[9]: 2In [10]: del tIn [11]: sys.getrefcount(t)---------------------------------------------------------------------------NameError                                 Traceback (most recent call last)
in
()----> 1 sys.getrefcount(t)NameError: name 't' is not defined

 

转载于:https://www.cnblogs.com/venicid/p/7886733.html

你可能感兴趣的文章
php提交表单校验例子
查看>>
man查看帮助命令
查看>>
【SVM】libsvm-python
查看>>
mysql 修改已存在的表增加ID属性为auto_increment自动增长
查看>>
sgu 109 Magic of David Copperfield II
查看>>
C++循环单链表删除连续相邻重复值
查看>>
IIS 7.5 + PHP-5.6.3 + mysql-5.6.21.1(转载)
查看>>
渣渣小本求职复习之路每天一博客系列——Java基础(3)
查看>>
C#调用WIN32 的API函数--USER32.DLL
查看>>
ListView下拉刷新实现
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
【7集iCore3基础视频】7-4 iCore3连接示意图
查看>>
ASP.NET使网页弹出窗口不再困难
查看>>
Leetcode Balanced Binary Tree
查看>>
Day1:Spring-IoC、DI
查看>>
Leetcode 92. Reverse Linked List II
查看>>
TensorFlow2-维度变换
查看>>
Redux源码分析之createStore
查看>>
POJ 2060 最小路径覆盖
查看>>
label标签作用
查看>>