对Python中class和instance以及self的用法详解


Posted in Python onJune 26, 2019

一. Python 的类和实例

在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的 “对象”。

就好比,学生是个较为抽象的概念,同时拥有很多属性,可以用一个 Student 类来描述,类中可定义学生的分数、身高等属性,但是没有具体的数值。而实例是类创建的一个个具体的对象, 每一个对象都从类中继承有相同的方法,但是属性值可能不同,如创建一个实例叫 hansry 的学生,其分数为 93,身高为 176,则这个实例拥有具体的数值。

1.类:以Student类为例,在Python中,定义类如下:

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

a.(object)表示的是该类从哪个类继承下来的,而object类是每个类都会继承的一个类。 yt

b. __init__ 方法的第一参数永远是 self,用来表示类创建的实例本身,因此,在 __init__ 方法内部,就可以把各种属性绑定到self,因为self 本身就是指向创建的实例本身。

c. 有了 __init__ 方法后,在创建实例的时候,就不能传入空参数,必须传入与 __init__ 方法匹配的参数,但self本身不需要传入参数,只需要传入 self 后面的参数即可。

2.实例: 定义好了类后,就可以通过Student类创建出 Student 的实例,创建实例是通过 类名 + ()实现:

student = Student('name', 93)

>>> student.name
"name"
>>> student.score
93

a. 其中 Student 是类名称,('name',93)为要传入的参数

b. self.name 就是 Student类的属性变量,为 Student 类所有。同时, name 是外部传来的参数,不是 Student 类所自带的。故 self.name = name 的意思就是把外部传来的参数 name 的值赋值给 Student类自己的属性变量 self.name .

3.和普通函数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量 self, 并且调用时,不用传递该参数。 除此之外,类的方法(函数)和普通函数没有啥区别。既可以用 默认参数、可变参数或者关键字参数等。

二. 类 以及 实例的访问

1.限制外部对类实例属性的访问

既然 Student 类实例本身就拥有这些属性的数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以在类的内部定义访问数据的函数,这样,就可以把 ”数据“ 封装起来了。这些封装数据的函数和 Student 类本身是相关联的,称之为类的方法:

class Student(obiect):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print "%s: %d" % (self.name, self.score)
>>> student= Student("hansry",99)
>>> student.print_property()

hansry:99

由此可见,从外部看Student类,我们只知道创建实例需要给出 name 和 score。究竟如何打印,是 Student 类内部定义的,这些数据和逻辑被封装起来了,调用也就变得容易了,但是不知道内部实现的细节。

如果不想让实例中的内部属性被外部属性访问,则把 name 和 score 变成 __name 和 __score 即可,如下代码所示:

class Student(object):

  def __init__(self, name, score):
    self.__name = name
    self.__score = score
  def print_property(self):
    print "%s: %d" %(self.__name,self.__score)
>>> student= Student("hansry",99)
>>> student.print_property()
>>> student.__name()

hansry:99
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute '__name'

2.开 API 使得外部代码能够访问到里面的属性,并且对其进行修改

外部代码访问到类实例属性,代码如下:

def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score
name=student.get_name()
score=student.get_score()
print ("%s,%d" % (name,score))

外部代码修改类里面的实例属性,代码如下:

def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def reset_name(self,change_name):
    self.__name = change_name

  def reset_score(self, change_score):
    self.__score = change_score
student= Student("hansry",99)
student.print_property()
student.reset_name("simona")
student.reset_score(91)
name=student.get_name()
score=student.get_score()
print ("%s:%d" % (name,score))

hansry:99
simona:91

需要注意的是,在Python中,变量名类似 _xxx_的,也就是双下划线开头,并且以下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是 private 变量,不能用 __name__, __score__ 。

三. self 的仔细用法

1.self代表类的实例,而非类。

class Student(object):
  def print_self(self):
    print(self)
    print(self.__class__)
student=Student()
student.print_self()

<__main__.Student object at 0x7fd9095aed90>
<class '__main__.Student'>

从上面例子可得,self代表的只是类的实例,而 self.__class__ 才是类。

2. 定义类的时候,self最好写上,因为它代表了类的实例。

3. 在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。

class Teacher(object):
  def __init__(self,teacher):
    self.teacher=teacher
    print(self.teacher)

  def print_self(self):
    print(self)

class Student(Teacher):
  def __init__(self,student):
    self.student=student    
    print(self.student)

  def print_self_1(self):
    print(self)
teacher=Teacher("hansry")
student=Student("simona")
student.print_self_1()
student.print_self()

hansry
simona
<__main__.Student object at 0x7fd9095b0950>
<__main__.Student object at 0x7fd9095b0950>

在运行 student.print_self() 的时候,这里是调用了 类 Teacher 的 print_self() 函数,此时虽然调用的是 类Teacher的函数,但是此时的实例 self 确是 类 Student 实例化时生成的。

以上这篇对Python中class和instance以及self的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
全面了解python字符串和字典
Jul 07 Python
Python实现的简单dns查询功能示例
May 24 Python
Python通过matplotlib绘制动画简单实例
Dec 13 Python
对python 调用类属性的方法详解
Jul 02 Python
opencv 获取rtsp流媒体视频的实现方法
Aug 23 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
Django CSRF认证的几种解决方案
Mar 03 Python
Python函数__new__及__init__作用及区别解析
Aug 31 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 #Python
对python 中class与变量的使用方法详解
Jun 26 #Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 #Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 #Python
Python Numpy 实现交换两行和两列的方法
Jun 26 #Python
python 字典操作提取key,value的方法
Jun 26 #Python
通过PYTHON来实现图像分割详解
Jun 26 #Python
You might like
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
php操作redis数据库常见方法实例总结
2020/02/20 PHP
JS数组的赋值介绍
2014/03/10 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
jquery插件jquery.confirm弹出确认消息
2015/12/22 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
2019/03/28 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
2019/06/12 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python程序中的观察者模式结构编写示例
2016/05/27 Python
python2.7的编码问题与解决方法
2016/10/04 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
Django Admin实现三级联动的示例代码(省市区)
2018/06/22 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
python集合能干吗
2020/07/19 Python
python如何爬取动态网站
2020/09/09 Python
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
什么是Smarty变量操作符?如何使用Smarty变量操作符
2014/07/18 面试题
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
学校卫生检查制度
2014/02/03 职场文书
优秀家长事迹材料
2014/05/17 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
公司行政助理岗位职责
2015/04/11 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
基于Redission的分布式锁实战
2022/08/14 Redis