Python笔记(十八)_私有属性、实例属性、类属性
私有属性
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改。
这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮
那如果想让外部代码获取私有属性该怎么办?
修改内部代码:可以给类增加访问方法(return self.__name)和修改方法(self.__score=score)
>>>class Student(object):
def get_name(self):
return self.__name
>>>class Student(object):
def set_score(self, score):
self.__score = score
从外部直接调用:不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,其实仍然可以通过bart.__Student__name来访问私有属性(不推荐使用)
实例属性
方法一:通过实例变量绑定(只对绑定的实例起作用)
>>>class Student():
pass
>>>bart = Student()
可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:
>>>bart.name = 'Bart Simpson'
>>>bart.name
'Bart Simpson'
方法二:通过self变量绑定(所有实例都起作用)
由于类可以起到模板的作用,因此可以在创建类的时候,通过定义一个特殊的__init__方法,把一些我们认为必须绑定的属性强制填写进去
>>>class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
注意:__init__方法的第一个参数永远是self,表示创建的实例本身;因此在__init__方法内部,就可以把各种属性绑定到self,也就是绑定到实例,因为self就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数
给实例限定属性
定义一个特殊的__slots__变量,来限制该class实例能添加的属性
>>>class Student(object):
__slots__ = ('name', 'age')
>>>s = Student()
>>>s.score = 99 #报错
注意:__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的,除非在子类中也定义一个__slots__
类属性
给类绑定属性:直接在class中定义即可
>>>class Student():
name = 'demi'
定义好的name即为类属性,这个属性虽然归类所有,但类的所有实例都可以访问
>>>s = Student()
>>>print(s.name)
demi
或者
>>>Student.name
demi
注意:
实例属性属于各个实例所有,互不干扰
类属性属于类所有,所有实例都可共用
不要对实例属性和类属性使用相同的名字,否则实例属性将屏蔽掉类属性
不要对属性和方法使用相同的名字,否则属性会覆盖方法
>>>class C:
def x(self):
print('Xman')
>>>c = C()
>>>c.x()
Xman
>>>c.x = 1
>>>c.x() #报错,属性与方法重名了
Python笔记(十八)_私有属性、实例属性、类属性的更多相关文章
- Python爬虫(十八)_多线程糗事百科案例
多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...
- Python笔记(十五)_异常处理
try-except语句 try: 被检测代码 except Exception [as reason]: 出现异常后的处理代码 例: try: sum = 1+' f=open('未定义文件.txt ...
- Python笔记(十四)_永久存储pickle
pickle模块:将所有的Python对象转换成二进制文件存放 应用场景:编程时最好将大对象(列表.字典.集合等)用pickle写成永久数据包供程序调用,而不是直接写入程序 写入过程:将list转换为 ...
- [b0033] python 归纳 (十八)_队列Queue在多线程中使用(二)
# -*- coding: UTF-8 -*- """ 多线程同时读队列 使用 join(), task_done() 逻辑: 3个子线程并发 从有6个数据的队列中取数据 ...
- Python笔记(十九)_继承
继承 继承可以把父类的所有功能都直接拿过来,这样就不必从零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写 多重继承 通过多重继承,一个子类就可以同时获得多个父类的所有功能 > ...
- Python笔记(十二)_文件
文件的打开模式 'r':以只读的方式打开文件(默认) 'w':以写入的方式打开文件,会覆盖已存在的文件 'x':用写入的方式打开文件,如果文件已存在,会抛出异常 'a':用写入的方式打开文件,如果文件 ...
- Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...
- Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性
类属性.实例属性和私有属性 Python中类的属性主要包括类属性,实例属性和私有属性,下面是对三种属性的简单介绍 类属性 / Class Property 类属性在__init__()之外初始化,在外 ...
- python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置
python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...
随机推荐
- 阿里大佬教你,如何写好 Java 代码!
点击上方蓝色链接,关注并"设为星标" Java干货,每天及时推送 阿里大佬分享的一篇很不错的文章,推荐收藏! 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生 ...
- python 迭代器和生成器的区别
迭代器(iterator)是一个实现了迭代器协议的对象,python的一些内置数据类型(列表,数组,字符串,字典等)都可以通过for语句进行迭代,我们也可以自己创建一个容器,实现了迭代器协议,可以通过 ...
- HCL AppScan Standard 9.0.3.13
https://pan.baidu.com/s/1mh97vyJdWy1CmF589jZJhQ 网盘密码: q31g / 压缩密码:shungg.cn http://www.shungg.cn/pos ...
- 树莓派上编译安装python3.6
1.更新树莓派系统 sudo apt-get update sudo apt-get upgrade -y 2.安装python依赖环境 sudo apt-get install build-esse ...
- asp.net Base64加解密
1.前端 JS: /* * base64.js * * Licensed under the BSD 3-Clause License. * http://opensource.org/license ...
- 2018-11-26-win10-UWP-Controls-by-function
title author date CreateTime categories win10 UWP Controls by function lindexi 2018-11-26 20:0:6 +08 ...
- win7提示不是正版桌面变黑
1.以管理员身份运行cmd.exe 2.在该界面>后面输入SLMGR -REARM,大家注意下有个空格键 然后点击确定,重启电脑就OK了.
- VNware上安装虚拟机Ubuntu16.10 并安装petalinux(版本问题的坑 弃帖 另开一帖)
1.下载Ubuntu镜像文件 最新版本:https://ubuntu.com/download/desktop 老版本:http://old-releases.ubuntu.com/releases/ ...
- Wannafly挑战赛27 C蓝魔法师
链接Wannafly挑战赛27 C蓝魔法师 给出一棵树,求有多少种删边方案,使得删后的图每个连通块大小小于等于\(k\),\(n,k\leq 2*10^3\) 假设我们正在考虑\(i\)这个子树,那么 ...
- ATM机取款过程
假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码,最多只能输入三次,超过3次则提示用户“密码错误,请取卡”结束交易.如果用户密码正确,再提示用户输入取款金额,ATM机只能输出100元的纸 ...