python 面向对象编程:类和实例
深度学习在构建网络模型时,看到用类来构建一个模型实例,清晰明了,所以这篇博文主要学习一下python类
类和实例:
类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的__init__(
注意:特殊方法“__init__”前后分别有两个下划线!!!),
方法,在创建实例的时候,就把name
,score
等属性绑上去:
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类的定义来看,外部代码还是可以自由地修改一个实例的name
、score
属性:
>>> 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_name
和get_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
类中,每个实例就拥有各自的name
和score
这些数据。我们可以通过函数来访问这些数据,比如打印一个学生的成绩:
>>> 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 面向对象编程:类和实例相关推荐
- python编程例子-Python面向对象编程 - 类和实例
一.preface 面向对象编程OOP:object oriented programming. OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.Python是一门面向对象的编程语 ...
- python对象编程例子-python 面向对象编程 类和实例
class Student(object): #class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.通常,如果没有合适的继承 ...
- python的类和实例_Python 面向对象编程——类和实例
1面向对象编程 面向对象编程: 面向对象编程--Object OrientedProgramming OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程 ...
- [转] 面向对象编程 - 类和实例
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的 ...
- Python面向对象编程——类的学习
面向对象编程 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向 ...
- 【轻松学】Python面向对象编程——类的设计、基础语法、继承、多态、类属性和类方法、单例设计
文章目录 1. 类的设计 大驼峰命名法 1.1 类名的确定 1.2 属性和方法的确定 练习 1.1 练习 1.2 2. 面相对象基础语法 2.1 定义简单的类(只包含方法) 2.1.1 定义只包含方法 ...
- python多个对象调用类方法、且之间有联系_趣味解读Python面向对象编程 (类和对象)...
一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢? 面向 ...
- Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)
以下是博主认为的对self讲解得比较透彻又简洁明了的资料. 上面的资料把这个问题说得简单明了,大家认真看一遍相信就对self有个深入的了解了. 总结一下: 在Python为面向对象编程中,成员函数被调 ...
- python面向对象图片_趣味解读Python面向对象编程 (类和对象)
一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢?面向过 ...
- python面向对象编程类的成员总结
类.对象的三大成员之一字段,静态字段,动态字段 1.静态字段与普通字段的区别,静态字段属于类,普通字段属于有类生成的对象, 2.在内存中的存储方式也不一样,静态字段在内存中存储一份,普通字段每个对象存 ...
最新文章
- oracle 强制 断开,ORA-01092 ORACLE 实例终止。强制断开连接 解决方案(下)
- docker 无法正常启动 解决方法
- python文字教程-Python 爬虫零基础教程(3):输出一个网页上的文字
- 初等数学O 集合论基础 第二节 映射与集合的势
- 给Source Insight做个外挂系列之六--“TabSiPlus”的其它问题
- 沈向洋谈文献阅读(转载)
- SpringBoot集成MyBatis-Plus分页插件
- 字体设计师必备灵感来源
- linux off_t类型的头文件,linux下32位机与64位机基本数据类型长度对比
- linux系统下的权限知识梳理
- 《CSS基础教程》 读书笔记三
- 多项式拟合怎么确定次数_PyTorch入门4 搭建多项式回归模型
- OkHttp 官方Wiki之【使用案例】
- 字节流自带缓存,而字节流不带
- 内网穿透端口映射工具
- navicat for mysql Mac版 中文免安装
- 派生类中重新定义虚函数及虚函数的注意事项
- vivos9e防抖功能设置教程
- Tracup——提升工作效率的利剑
- 5个值得收藏的图片素材APP	和网站,高品质外加免费,拿走不谢