私有属性

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,就变成了一个私有属性,只有内部可以访问,外部不能直接访问或修改。

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮

那如果想让外部代码获取私有属性该怎么办?

修改内部代码:可以给类增加访问方法(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笔记(十八)_私有属性、实例属性、类属性的更多相关文章

  1. Python爬虫(十八)_多线程糗事百科案例

    多线程糗事百科案例 案例要求参考上一个糗事百科单进程案例:http://www.cnblogs.com/miqi1992/p/8081929.html Queue(队列对象) Queue是python ...

  2. Python笔记(十五)_异常处理

    try-except语句 try: 被检测代码 except Exception [as reason]: 出现异常后的处理代码 例: try: sum = 1+' f=open('未定义文件.txt ...

  3. Python笔记(十四)_永久存储pickle

    pickle模块:将所有的Python对象转换成二进制文件存放 应用场景:编程时最好将大对象(列表.字典.集合等)用pickle写成永久数据包供程序调用,而不是直接写入程序 写入过程:将list转换为 ...

  4. [b0033] python 归纳 (十八)_队列Queue在多线程中使用(二)

    # -*- coding: UTF-8 -*- """ 多线程同时读队列 使用 join(), task_done() 逻辑: 3个子线程并发 从有6个数据的队列中取数据 ...

  5. Python笔记(十九)_继承

    继承 继承可以把父类的所有功能都直接拿过来,这样就不必从零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写 多重继承 通过多重继承,一个子类就可以同时获得多个父类的所有功能 > ...

  6. Python笔记(十二)_文件

    文件的打开模式 'r':以只读的方式打开文件(默认) 'w':以写入的方式打开文件,会覆盖已存在的文件 'x':用写入的方式打开文件,如果文件已存在,会抛出异常 'a':用写入的方式打开文件,如果文件 ...

  7. Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...

  8. Python的程序结构[0] -> 属性/Property[0] -> 类属性、实例属性和私有属性

    类属性.实例属性和私有属性 Python中类的属性主要包括类属性,实例属性和私有属性,下面是对三种属性的简单介绍 类属性 / Class Property 类属性在__init__()之外初始化,在外 ...

  9. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

随机推荐

  1. ES6判断当前页面是否微信浏览器中打开

    1.使用jq判断是否用微信浏览器打开页面 var is_weixin = (function(){return navigator.userAgent.toLowerCase().indexOf('m ...

  2. 【CF321E】+【bzoj5311】

    决策单调性 + WQS二分 贴个代码先... //by Judge #pragma GCC optimize("Ofast") #include<bits/stdc++.h& ...

  3. Codeforces - 1199C - MP3 - 尺取

    https://codeforc.es/contest/1199/problem/C 擦,最后移位运算符溢出了,真的蠢. 肯定是选中间的连续的某段是最优的,维护这个段的长度和其中的元素种类就可以了.小 ...

  4. python学习第四十三天生成器和next()关联

    我们在用列表生成式的时候,如果有一百万的数据,内存显然不够用,这是python想要什么数据,就生产什么数据给你,就产生了生成器,下面简单讲述生成器用法 1,生成器的用法 a=([a*a for a i ...

  5. JavaScript基础9——操作DOM树

    appendChild()方法:添加子节点到末尾 类似于剪切粘贴的效果   insertBefore(newNode, oldNode)方法:在某个节点之前插入一个节点 newNode为要插入的节点, ...

  6. mysql语句之DDL

    SQL分类: DDL(Data Definition Languages)语句:数据定义语言,这些语句定义了不同的数据段.数据库.表.列.索引等数据库对象的定义.常用的语句关键字主要包括create. ...

  7. ffmpeg知多少~~~

    一.ffmpeg安装: https://jingyan.baidu.com/article/f7ff0bfcd64cea2e26bb1334.html   二.ffmpeg视频处理(包括各种视频流处理 ...

  8. linux tcp/ip 调优

    sysctl 变量修改方法:sysctl –a 使用 sysctl 命令修改系统变量,和通过编辑 sysctl.conf 文件来修改系统变量两种.但并不是所有的 变量都可以在这个模式下设定. 注:sy ...

  9. 基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台

    基于双TMS320C6678+双XC6VSX315T的6U VPX高速数据处理平台   一.板卡概述 板卡由我公司自主研发,基于VPX架构,主体芯片为两片 TI DSP TMS320C6678,两片V ...

  10. 【改】shell 判断文件中有无特定子串方法(grep)

    转自:https://blog.csdn.net/zhuguiqin1/article/details/79160923 利用grep执行的命令结束代码$?的值来判断是否已经grep到特定的值. 当$ ...