深度学习在构建网络模型时,看到用类来构建一个模型实例,清晰明了,所以这篇博文主要学习一下python类

类和实例:

类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__(注意:特殊方法“__init__”前后分别有两个下划线!!!),方法,在创建实例的时候,就把namescore等属性绑上去:

class Student(object):def __init__(self, name, score):self.name = nameself.score = score

__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。有了__init__方法,创建实例的时候必须传入与__init__方法匹配的参数,self不需要传,Python解释器自己会把实例变量传进去:

>>> bart = Student('Bart Simpson', 59)
>>> bart.name
'Bart Simpson'

和普通函数想比,类中定义的函数第一个参数永远是实例变量self,其他没有什么不同。

访问限制:

但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的namescore属性:

>>> bart = Student('Bart Simpson', 59)
>>> bart.score
59
>>> bart.score = 99
>>> bart.score
99

如果在属性的名称前加上两个下划线__,在python中就是一个私有变量,只有内部可以访问,外部不能访问,需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

class Student(object):def __init__(self, name, score):self.__name = nameself.__score = scoredef print_score(self):print('%s: %s' % (self.__name, self.__score))>>> bart = Student('Bart Simpson', 59)
>>> bart.__name
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'>>> bart._Student__name
'Bart Simpson'

但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。

最后注意下面的这种错误写法,表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量:

>>> bart = Student('Bart Simpson', 59)
>>> bart.get_name()
'Bart Simpson'
>>> bart.__name = 'New Name' # 设置__name变量!
>>> bart.__name
'New Name'

但是如果外部代码要获取name和score怎么办?可以给Student类增加get_nameget_score这样的方法; 如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:

class Student(object):...def get_name(self):return self.__namedef get_score(self):return self.__scoredef set_score(self, score):self.__score = score

数据封装:

面向对象编程的一个重要特点就是数据封装。在上面的Student类中,每个实例就拥有各自的namescore这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩:

>>> def print_score(std):
...     print('%s: %s' % (std.name, std.score))
...
>>> print_score(bart)
Bart Simpson: 59

但是,既然Student实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数(如在上一部分中讲到的获取与修改数据的方法),我们称之为类的方法,定义一个方法,除了第一个参数是self外,其他和普通函数一样:

class Student(object):def __init__(self, name, score):self.name = nameself.score = scoredef print_score(self):print('%s: %s' % (self.name, self.score))

实例属性和类属性

由于python是动态语言,由于Python是动态语言,根据类创建的实例可以任意绑定属性。

给实例绑定属性的方法是通过实例变量,或者通过self变量:

class Student(object):def __init__(self, name):self.name = names = Student('Bob')
s.score = 90

但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有:

class Student(object):name = 'Student'

当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。来测试一下:

>>> class Student(object):
...     name = 'Student'
...
>>> s = Student() # 创建实例s
>>> print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性
Student
>>> print(Student.name) # 打印类的name属性
Student
>>> s.name = 'Michael' # 给实例绑定name属性
>>> print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性
Michael
>>> print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问
Student
>>> del s.name # 如果删除实例的name属性
>>> print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了
Student

从上面的例子可以看出,在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

python 面向对象编程:类和实例相关推荐

  1. python编程例子-Python面向对象编程 - 类和实例

    一.preface 面向对象编程OOP:object oriented programming. OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.Python是一门面向对象的编程语 ...

  2. python对象编程例子-python 面向对象编程 类和实例

    class Student(object): #class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.通常,如果没有合适的继承 ...

  3. python的类和实例_Python 面向对象编程——类和实例

    1面向对象编程 面向对象编程: 面向对象编程--Object OrientedProgramming OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程 ...

  4. [转] 面向对象编程 - 类和实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的 ...

  5. Python面向对象编程——类的学习

    面向对象编程     面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向 ...

  6. 【轻松学】Python面向对象编程——类的设计、基础语法、继承、多态、类属性和类方法、单例设计

    文章目录 1. 类的设计 大驼峰命名法 1.1 类名的确定 1.2 属性和方法的确定 练习 1.1 练习 1.2 2. 面相对象基础语法 2.1 定义简单的类(只包含方法) 2.1.1 定义只包含方法 ...

  7. python多个对象调用类方法、且之间有联系_趣味解读Python面向对象编程 (类和对象)...

    一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢? 面向 ...

  8. Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)

    以下是博主认为的对self讲解得比较透彻又简洁明了的资料. 上面的资料把这个问题说得简单明了,大家认真看一遍相信就对self有个深入的了解了. 总结一下: 在Python为面向对象编程中,成员函数被调 ...

  9. python面向对象图片_趣味解读Python面向对象编程 (类和对象)

    一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢?面向过 ...

  10. python面向对象编程类的成员总结

    类.对象的三大成员之一字段,静态字段,动态字段 1.静态字段与普通字段的区别,静态字段属于类,普通字段属于有类生成的对象, 2.在内存中的存储方式也不一样,静态字段在内存中存储一份,普通字段每个对象存 ...

最新文章

  1. oracle 强制 断开,ORA-01092 ORACLE 实例终止。强制断开连接 解决方案(下)
  2. docker 无法正常启动 解决方法
  3. python文字教程-Python 爬虫零基础教程(3):输出一个网页上的文字
  4. 初等数学O 集合论基础 第二节 映射与集合的势
  5. 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题
  6. 沈向洋谈文献阅读(转载)
  7. SpringBoot集成MyBatis-Plus分页插件
  8. 字体设计师必备灵感来源
  9. linux off_t类型的头文件,linux下32位机与64位机基本数据类型长度对比
  10. linux系统下的权限知识梳理
  11. 《CSS基础教程》 读书笔记三
  12. 多项式拟合怎么确定次数_PyTorch入门4 搭建多项式回归模型
  13. OkHttp 官方Wiki之【使用案例】
  14. 字节流自带缓存,而字节流不带
  15. 内网穿透端口映射工具
  16. navicat for mysql Mac版 中文免安装
  17. 派生类中重新定义虚函数及虚函数的注意事项
  18. vivos9e防抖功能设置教程
  19. Tracup——提升工作效率的利剑
  20. 5个值得收藏的图片素材APP 和网站,高品质外加免费,拿走不谢

热门文章

  1. JQuery选择器中的子元素选择器
  2. 网页中的各种高度说明
  3. 使用document.ElementByTagName获取input元素并添加事件
  4. 三维重建:PNG格式详解-与LibPNG使用
  5. ubuntu16.04安装KDE
  6. 华容道6×6图解_2008款马自达6仪表盘图解,仪表盘故障指示灯图解
  7. spring boot框架学习学前掌握之重要注解(2)-通过java的配置方式进行配置spring
  8. MySQL 基础---数据库维护和性能提高
  9. fiddler怎么修改服务器返回参数并发送
  10. NHibernate初探-SQLDialects