""" 类和实例和访问权限 """
__author__ = 'shaozhiqi' # class后面紧接着是类名,即Student,类名通常是大写开头的单词,
# 紧接着是(object),表示该类是从哪个类继承下来的
class Student(object):
pass bart = Student() # 变量bart指向的就是一个Student的实例
bart.name = 'Bart Simpson'
print(bart.name) # Bart Simpson --可以自由地给一个实例变量绑定属性,即使类里没有定义这个属性 # 通过定义一个特殊的__init__方法,在创建实例的时候,就把我们任务必须的属性绑上去,如下:
class Student(object): def __init__(self, name, score):
self.name = name
self.score = score def print_score(self):
print('%s: %s' % (self.name, self.score)) # __init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
# 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去:
bart = Student('Bart Simpson ', 30)
print('name: ', bart.name) # name: Bart Simpson 可以看出name是public的 # 调用实例方法
bart.print_score() # Bart Simpson : 30 # ----------------------------限制访问----------------------
class Student2(object): def __init__(self, name, score):
self.__name = name
self.__score = score def print_score(self):
print('%s: %s' % (self.__name, self.__score)) # 对外暴露外部访问方法
def get_name(self):
return self.__name def set_name(self, name):
self.__name = name bart2 = Student2('Bart Simpson2 ', 30)
# print('name: ', bart2.__name) # 访问异常 'Student2' object has no attribute '__name'
print('name: ', bart2.get_name()) # name: Bart Simpson2
bart2.set_name('shao')
print('name: ', bart2.get_name()) # name: shao # 1.双下划线开头双下划线结尾
# 在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,
# 是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
# 2.单下划线开头的变量
# _name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,
# 意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。
# 3.只以双下划线开头
# 不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,
# 仍然可以通过_Student__name来访问__name
bart2.__name = 'New Name' # 设置__name变量!
print(bart2.__name) # New Name
# 面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!
# 内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量
# 下面调用可以验证上面的结论
print(bart2.get_name()) # shao

最新文章

  1. 利用FileSystemWatcher实现磁盘文件监控
  2. hadoop运行原理之Job运行(四) JobTracker端心跳机制分析
  3. python包的概念
  4. Maven系列--pom.xml 配置详解
  5. Android系统移植与驱动开发——第五章--搭建开发板的测试环境
  6. OpenNMS在安装”我找不到jrrd.dll“错误的解决方法
  7. 全方位分析Objcetive-C Runtime
  8. IOS手势识别,捏合,旋转,轻扫等
  9. ECMA Script 6_ 类 class
  10. error: ‘module’ object has no attribute ‘_rebuild_tensor_v2’
  11. zigbee_蓝牙_wifi的比较与区别分析
  12. 【转载】C#检测客户端输入的内容是否含有危险字符串
  13. SpringBoot入门笔记(四)、通常Mybatis项目目录结构
  14. adb的使用
  15. window10总提示幸福倒计时,解决方法
  16. TitleBar 的那些设置
  17. C#项目中关于多个程序集下App.config文件的问题
  18. rabbitmq heartbeat missing with heartbeat = N seconds原因总结
  19. vuex简介(转载)
  20. flume-ng-sql-source实现oracle增量数据读取

热门文章

  1. 如何区分前端BUG和后台BUG?
  2. SpringMVC框架——转发与重定向
  3. Selenium系列(一) - 8种元素定位方式的详细解读
  4. kubernetes 1.17.2结合ceph13.2.8 实现jenkins部署并用traefik2.1代理
  5. 10个python爬虫入门实例
  6. 一些Nmap NSE脚本推荐
  7. 阿里云服务器Ubuntu系统搭建LNMP环境
  8. 原 c++中map与unordered_map的区别
  9. 图解JVM类加载机制和双亲委派模型
  10. 使用python-crontab给linxu设置定时任务