类和实例

阅读: 19079

评论:6

类,英文名字Class,有“类别”,“分类”,“聚类”的意思。必须牢记类是抽象的模板,用来描述具有相同属性和方法的对象的集合,比如Animal类。而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

Python使用class关键字来定义类,其基本结构如下:

class 类名(父类列表):

pass

类名通常采用驼峰式命名方式,尽量让字面意思体现出类的作用。Python采用多继承机制,一个类可以同时继承多个父类(也叫基类、超类),继承的基类有先后顺序,写在类名后的圆括号里。继承的父类列表可以为空,此时的圆括号可以省略。但在Python3中,即使你采用类似class Student:pass的方法没有显式继承任何父类的定义了一个类,它也默认继承object类。因为,object是Python3中所有类的基类。

下面是一个学生类:

class Student:

classroom = '101'

address = 'beijing'

def __init__(self, name, age):

self.name = name

self.age = age

def print_age(self):

print('%s:%s' % (self.name, self.age))

可以通过调用类的实例化方法(有的语言中也叫初始化方法或构造函数)来创建一个类的实例。默认情况下,使用类似obj=Student()的方式就可以生成一个类的实例。但是,通常每个类的实例都会有自己的实例变量,例如这里的name和age,为了在实例化的时候体现实例的不同,Python提供了一个def __init__(self):的实例化机制。任何一个类中,名字为__init__的方法就是类的实例化方法,具有__init__方法的类在实例化的时候,会自动调用该方法,并传递对应的参数。比如:

li = Student("李四", 24)

zhang = Student("张三", 23)

实例变量和类变量

实例变量:

实例变量指的是实例本身拥有的变量。每个实例的变量在内存中都不一样。Student类中__init__方法里的name和age就是两个实例变量。通过实例名加圆点的方式调用实例变量。

我们打印下面四个变量,可以看到每个实例的变量名虽然一样,但他们保存的值却是各自独立的:

print(li.name)

print(li.age)

print(zhang.name)

print(zhang.age)

------------------------

李四

24

张三

23

类变量:

定义在类中,方法之外的变量,称作类变量。类变量是所有实例公有的变量,每一个实例都可以访问、修改类变量。在Student类中,classroom和address两个变量就是类变量。可以通过类名或者实例名加圆点的方式访问类变量,比如:

Student.classroom

Student.address

li.classroom

zhang.address

在使用实例变量和类变量的时候一定要注意,使用类似zhang.name访问变量的时候,实例会先在自己的实例变量列表里查找是否有这个实例变量,如果没有,那么它就会去类变量列表里找,如果还没有,弹出异常。

Python动态语言的特点,让我们可以随时给实例添加新的实例变量,给类添加新的类变量和方法。因此,在使用li.classroom = '102'的时候,要么是给已有的实例变量classroom重新赋值,要么就是新建一个li专属的实例变量classroom并赋值为"102’。看下面的例子:

>>> class Student: # 类的定义体

classroom = '101' # 类变量

address = 'beijing'

def __init__(self, name, age):

self.name = name

self.age = age

def print_age(self):

print('%s:%s' % (self.name, self.age))

>>> li = Student("李四", 24) # 创建一个实例

>>> zhang = Student("张三", 23) # 创建第二个实例

>>> li.classroom # li本身没有classroom实例变量,所以去寻找类变量,它找到了!

'101'

>>> zhang.classroom # 与li同理

'101'

>>> Student.classroom # 通过类名访问类变量

'101'

>>> li.classroom = '102' # 关键的一步!实际是为li创建了独有的实例变量,只不过名字和类变量一样,都叫做classroom。

>>> li.classroom # 再次访问的时候,访问到的是li自己的实例变量classroom

'102'

>>> zhang.classroom # zhang没有实例变量classroom,依然访问类变量classroom

'101'

>>> Student.classroom # 保持不变

'101'

>>> del li.classroom # 删除了li的实例变量classroom

>>> li.classroom # 一切恢复了原样

'101'

>>> zhang.classroom

'101'

>>> Student.classroom

'101'

为了防止发生上面的混淆情况,对于类变量,请坚持使用类名.类变量的访问方式,不要用实例去访问类变量。

类的方法:

Python的类中包含实例方法、静态方法和类方法三种方法。这些方法无论是在代码编排中还是内存中都归属于类,区别在于传入的参数和调用方式不同。在类的内部,使用def关键字来定义一个方法。

实例方法

类的实例方法由实例调用,至少包含一个self参数,且为第一个参数。执行实例方法时,会自动将调用该方法的实例赋值给self。self代表的是类的实例,而非类本身。self不是关键字,而是Python约定成俗的命名,你完全可以取别的名字,但不建议这么做。

例如,我们前面Student类中的print_age()就是实例方法:

def print_age(self):

print('%s:%s' % (self.name, self.age))

# --------------------------

# 调用方法

li.print_age()

zhang.print_age()

静态方法

静态方法由类调用,无默认参数。将实例方法参数中的self去掉,然后在方法定义上方加上@staticmethod,就成为静态方法。它属于类,和实例无关。建议只使用类名.静态方法的调用方式。(虽然也可以使用实例名.静态方法的方式调用)

class Foo:

@staticmethod

def static_method():

pass

#调用方法

Foo.static_method()

类方法

类方法由类调用,采用@classmethod装饰,至少传入一个cls(代指类本身,类似self)参数。执行类方法时,自动将调用该方法的类赋值给cls。建议只使用类名.类方法的调用方式。(虽然也可以使用实例名.类方法的方式调用)

class Foo:

@classmethod

def class_method(cls):

pass

Foo.class_method()

看一个综合例子:

class Foo:

def __init__(self, name):

self.name = name

def ord_func(self):

"""定义实例方法,至少有一个self参数 """

print('实例方法')

@classmethod

def class_func(cls):

""" 定义类方法,至少有一个cls参数 """

print('类方法')

@staticmethod

def static_func():

""" 定义静态方法 ,无默认参数"""

print('静态方法')

# 调用实例方法

f = Foo("Jack")

f.ord_func()

Foo.ord_func(f) # 请注意这种调用方式,虽然可行,但建议不要这么做!

# 调用类方法

Foo.class_func()

f.class_func() # 请注意这种调用方式,虽然可行,但建议不要这么做!

# 调用静态方法

Foo.static_func()

f.static_func() # 请注意这种调用方式,虽然可行,但建议不要这么做!

类、类的方法、类变量、类的实例和实例变量在内存中是如何保存的?

类、类的所有方法以及类变量在内存中只有一份,所有的实例共享它们。而每一个实例都在内存中独立的保存自己和自己的实例变量。

创建实例时,实例中除了封装诸如name和age的实例变量之外,还会保存一个类对象指针,该值指向实例所属的类的地址。因此,实例可以寻找到自己的类,并进行相关调用,而类无法寻找到自己的某个实例。

评论总数: 6

你这可以出个书啊 简单易学

By

阿屋au On

2020年6月24日 20:11

回复

类变量:

定义在类中,方法之外的变量,称作类变量。类变量是所有实例公有的变量,每一个实例都可以访问、修改类变量。大佬下面例子实例没改到类变量啊

By

阿屋au On

2020年6月24日 20:10

回复

博主可以讲讲实例方法、类方法和静态方法在用途上的区别,这才是关键。

By

蔷薇-Nina On

2018年4月14日 23:13

回复

评论很到位

海盗小船雷小瑶

回复

蔷薇-Nina

2018年4月28日 21:53

回复

对呀,我也在这么想,静态方法和类方法看上去是一样的啊,有什么区别呢?不过我暂时不打算深入了解,因为目前用的不多,继续往下看,说不定有一天就懂了

定期换名字啦啦

回复

海盗小船雷小瑶

2020年6月5日 10:46

回复

666

By

海上有个树荫_hhh On

2018年3月11日 17:28

回复

python教程实例-python 类和实例 - 刘江的python教程相关推荐

  1. python判断是否为类的实例,是否为子类

    python判断是否为类的实例,是否为子类 文章目录: 一.获取类实例的名称 二.判断一个类是否是另外一个类的实例 三.判断某个实例是否是指定类的实例 首先定义两个类,一个父类,一个子类,这里并不定义 ...

  2. Python面向对象-概念、类、实例

    Python面向对象-概念.类.实例 OOP--Object Oriented Programming,面向对象编程,是一种程序设计思想.该思想将对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  3. python的unittest测试类代码实例

    nittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就 ...

  4. 廖雪峰python教程学习:类、实例与数据封装小结

    类.实例与数据封装小结 廖雪峰老师的python教程 1.类与实例 面向对象最重要的内容就是类(class),类是抽象的模板,后面紧接着是类名,紧接着是(object),表示其是从哪个类上继承上来的, ...

  5. python类实例_类和实例

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

  6. Python高级编程:类和实例属性的查找顺序—mro查找

    一. mro查找定义 如果多个类继承父类,然后又被多个类继承这种复杂的问题,可以使用mro方法 class D:pass class C(D):pass class B(D):pass class A ...

  7. python 面向对象编程:类和实例

    深度学习在构建网络模型时,看到用类来构建一个模型实例,清晰明了,所以这篇博文主要学习一下python类 类和实例: 类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填 ...

  8. python内容限制_Python --类,实例和访问限制

    与其他编程语言相比,Python的类机制添加了至少具有新语法和语义的类.它是C ++和Modula-3中发现的类机制的混合体. Python类提供面向对象编程的所有标准功能:类继承机制允许多个基类,派 ...

  9. python 类 实例_Python类的实例详解

    类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象.在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递 ...

  10. Python|面向对象编程的类和实例

    欢迎点击「算法与编程之美」↑关注我们! 本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章. 问题描述 Python是一门动态语言,面向对象编程是一个我们必 ...

最新文章

  1. Linux运维:CentOS7在防火墙中添加访问端口?
  2. 计算机科学术语,计算机科学中的术语(2)
  3. android如何编译出带符号表的.so库
  4. codeforces:65
  5. P4716-[模板]最小树形图
  6. 每天进步一点点《ML - KNN》
  7. hadoop之 hadoop日志存放路径
  8. java读取资源文件(Properties)
  9. tomcat war包解压规则
  10. Python函数嵌套
  11. 线程生命周期(状态)
  12. android手机无法root成功,手机怎么root不了怎么办?安卓手机不能root怎么办
  13. 阮一峰mysql_阮一峰:理解矩阵乘法
  14. #Logback入门 @FDDLC
  15. 中e管家投资理财收益最大化技巧
  16. 解决谷歌浏览器不能打开Axure原型的问题
  17. 2021年G1工业锅炉司炉考试平台及G1工业锅炉司炉作业考试题库
  18. wps 模拟分析 规划求解_wps表格如何实现规划求解运算
  19. UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xff in position 41: invalid start byte
  20. mysql where 条件先后_sql语句 where 后条件执行先后顺序

热门文章

  1. 开发日记-20190502 关键词 汇编语言(一)
  2. Android反编译技术总结
  3. 16年寒假随笔(1)
  4. lucene LZ4 会将doc存储在一个chunk里进行Lz4压缩 ES的_source便如此
  5. DNS解析污染原理——要么修改包,要么直接丢弃你的网络包
  6. IOT数据库选型——NOSQL,MemSQL,cassandra,Riak或者OpenTSDB,InfluxDB
  7. numpy vsplit
  8. 【转】性能监控 -- 应用服务器常见监控指标
  9. keybd_event 被 SendInput 替代
  10. GoLand配置数据库、远程host以及远程调试