python 面向对象之析构函数

析构函数: 

在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作, 如关闭一些数据库连接,关闭打开的临时文件

析构函数,是无法传参的

class Role(object):
    def __init__(self, name):
        self.name = name
    #析构函数
    def __del__(self):
        print('%s 彻底死了...' % self.name)

    def shot(self):
        print("shooting...")

r1 = Role('jack')

执行输出:

jack 彻底死了...

现在还没有干啥事情,怎么就执行了呢?

再执行一个类里面的函数

class Role(object):
    def __init__(self, name):
        self.name = name
    #析构函数
    def __del__(self):
        print('%s 彻底死了...' % self.name)

    def shot(self):
        print("shooting...")

r1 = Role('jack')
r1.shot()

执行输出:

shooting...

jack 彻底死了...

当程序退出的时候,实例就销毁了,所以最后执行了析构函数。

私有属性

外部不允许直接访问和修改

比如将name变成私有属性,外部测试访问

class Role(object):
    def __init__(self, name):
        #私有属性
        self.__name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
print(r1.__name)

执行报错

AttributeError: 'Role' object has no attribute '__name'

变成私有属性,在变量名前面加双下划线就可以了。

那么想在外部获取这个值,怎么办呢?

虽然外部无法直接访问,但是在类里面,是可以访问的,定义一个方法,用来获取私有属性

class Role(object):
    def __init__(self, name):
        self.__name = name

    def shot(self):
        print("shooting...")

    def show_name(self):
        print('name: %s' % self.__name)

r1 = Role('jack')
print(r1.show_name())

执行输出:

name: jack

None

在类里面,也可以更改私有属性的值

class Role(object):
    def __init__(self, name):
        self.__name = name

    def shot(self):
        print("shooting...")

    def show_name(self):
        self.__name = "Tom"
        print('name: %s' % self.__name)

r1 = Role('jack')
print(r1.show_name())

执行输出:

name: Tom

None

定义私有方法,和私有属性是一样的,前面加双下划线即可。

class Role(object):
    def __init__(self, name):
        self.__name = name
    #私有方法
    def __shot(self):
        print("shooting...")

    def show_name(self):
        self.__name = "Tom"
        print('name: %s' % self.__name)

r1 = Role('jack')
print(r1.__shot())

执行报错:

AttributeError: 'Role' object has no attribute '__shot'

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Google Dart

Dart语言指南(二) 顶

Dart是一种面向对象的语言 包含类和基于 mixin 的继承两部分。每个对象是一个类的实例, 并且 Object.是所有类的父类。 基于 mixin 的继承指...

2521
来自专栏Hongten

java中的Integer的toBinaryString()方法

在一次面试的过程中,遇到过这样的题目,题目的大概意思是:让写出Integer类中的toBinaryString()方法

1052
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻block的本质(一)

2824
来自专栏塔奇克马敲代码

第 9 章 顺序容器

2155
来自专栏Grace development

[CI代码解读] 告诉你为何libraries 方法引用命名规则需要大写

libraries 这个函数写的很大众化,基本意思就是首先参数是不是空呀。~ 然后就是因为可以传字符串,也可以传数组,既可以加载一个或多个类。然后首先他得判断下...

1971
来自专栏Golang语言社区

Golang语言之异常处理

在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态。作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表...

35313
来自专栏潇涧技术专栏

Python Basics

1.使用glob模块可以用通配符的方式搜索某个目录下的特定文件,返回结果是一个list

962
来自专栏申龙斌的程序人生

零基础学编程006:赋值语句

继续上次的一道练习题: 如何用Python打印这篇看上去很枯燥的《复利数据表》: (1+0.01) ^ 1 = 1.01 (1+0.01) ^ 2 = 1.0...

2875
来自专栏恰童鞋骚年

C#委托与事件学习笔记

      今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的“...

1053
来自专栏xingoo, 一个梦想做发明家的程序员

链表之顺序存储

顺序存储优点: 1 不用额外增加新的节点空间 2 可以快速读取任意位置的元素 顺序存储缺点: 1 插入和删除需要移动大量元素 2 长度变化较大时,难以估计长度 ...

1806

扫码关注云+社区

领取腾讯云代金券