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 <module>
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 <module>
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 sys

In [2]: #sys.getrefcount()

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

day 3 私有属性,私有方法,__del__的更多相关文章

  1. Python面向对象之私有属性和方法

    私有属性与私有方法 应用场景 在实际开发中,对象的某些属性或者方法 可能只希望在对象的内部被使用,而不希望在外部被访问到: 私有属性 就是对象不希望公开的属性: 私有方法 就是对象不希望公开的方法: ...

  2. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  3. 2019-4-16-C#-使用反射获取私有属性的方法

    title author date CreateTime categories C# 使用反射获取私有属性的方法 lindexi 2019-4-16 10:13:3 +0800 2018-09-26 ...

  4. JavaScript基础对象创建模式之私有属性和方法(024)

    JavaScript没有特殊的语法来表示对象的私有属性和方法,默认的情况下,所有的属性和方法都是公有的.如下面用字面声明的对象: var myobj = { myprop: 1, getProp: f ...

  5. Python中的私有属性私有方法、类属性类方法以及单例设计模式

    私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...

  6. Java反射学习总结二(用反射调用对象的私有属性和方法)

    大家都知道正常的调用是不可以访问对象的private修饰的属性和方法的,这也是Java的封装性原则. 但是有没有方法可以强制去访问对象的private修饰的属性和方法呢?那就是用反射!(这个可能在面试 ...

  7. python 类的私有属性和方法 (转载)

    转载:http://www.runoob.com/python/python-object.html 类属性与方法 类的私有属性 __private_attrs:两个下划线开头,声明该属性为私有,不能 ...

  8. Java反射机制(三):调用对象的私有属性和方法

    一. 通过反射调用类中的方法 在正常情况下,得到类的对象后,我们就可以直接调用类中的方法了,如果要想调用的话,则肯定必须清楚地知道要调用的方法是什么,之后通过Class类中的getMethod方法,可 ...

  9. C# 使用反射获取私有属性的方法

    本文告诉大家多个不同的方法使用反射获得私有属性,最后通过测试性能发现所有的方法的性能都差不多 在开始之前先添加一个测试的类 public class Foo { private string F { ...

  10. javascript使用闭包模拟私有属性和方法

    最近因为做了一个项目,其中涉及到了js私有方法,这个概念在其语言里面是很常见的,很多语言都有private这个关键字,只要在一个类的前面加上private就表示申明了一个私有方法,但是javascri ...

随机推荐

  1. 由JDK源码学习ArrayList

    ArrayList是实现了List接口的动态数组.与java中的数组相比,它的容量能动态增长.ArrayList的三大特点: ① 底层采用数组结构 ② 有序 ③ 非同步 下面我们从ArrayList的 ...

  2. jq实现简单的滑动解锁效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. css3—产品列表之鼠标滑过效果

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <title&g ...

  4. Kali-linux其他信息收集手段

    上面介绍了使用不同的工具以操作步骤的形式进行了信息收集.在Kali中还可以使用一些常规的或非常规方法来收集信息,如使用Recon-NG框架.Netdiscover工具和Shodan工具等.本节将介绍使 ...

  5. LWIP2.0.2 & FreeRTOS & MQTT 客户端的 使用

    1.参考链接 :http://www.nongnu.org/lwip/2_0_x/group__mqtt.html 2.首先移植好lwip,然后添加lwip-2.0.2\src\apps\mqtt   ...

  6. 大话Linux内核中锁机制之信号量、读写信号量

    大话Linux内核中锁机制之信号量.读写信号量 在上一篇博文中笔者分析了关于内存屏障.读写自旋锁以及顺序锁的相关内容,本篇博文将着重讨论有关信号量.读写信号量的内容. 六.信号量 关于信号量的内容,实 ...

  7. vue 路由缓存 路由嵌套 路由守卫 监听物理返回

    最近开发vue项目,遇到的一些问题,这里整合一下,看到一些博客已经有写相关知识,然后自己再次记录一下. 这是关于vue路由相关比较常见的问题,以后遇到相关路由的问题,会不断更新这篇博客. 需求1:从填 ...

  8. 学习Java的知识体系路线(详细完整版,附图加目录)

    将网上的Java学习路线图进行归纳囊括,方便以后学习时弥补自身所欠缺的知识点,也算是给自己一个明确的学习方向.至于第一阶段,即JavaSE的基础,这里不给出. 第二阶段 技术名称 技术内容 数据库技术 ...

  9. sublime Text3安装 markdownediting 报错 解决记录

    看了一下官方文档,也是醉了,都怪自己的无知. 在安装时候不要打开.md的文件,因为你里面有可能有一些语法错误,所以会导致报错. 解决方法关闭其他文件,在重新安装! 官方解释: 参考文档:Trouble ...

  10. Vue 子组件接收父组件的值

    1.父组件 <template> <div id="rightmenu8"> <rightmenu7 ref="rightmenu7&quo ...