类编写细节

1.class 语句

class语句细节

  • python的class语句是属于OOP的一种工具(即定义变量名的工具,将数据和逻辑暴露给客户端),而不是声明式的
  • class语句是对象的创建者,类似于对象工厂
  • class语句是一种隐含的赋值运算,即执行class语句时,会产生类对象并且将其引用存储到定义的类名称上
  • class语句与def一样,都是可执行语句,即python还没有执行到class语句时,类是不存在的
  • class是复合语句,所有种类语句都可以位于其主体内,如print, 赋值语句, if, def...

class语句如何得到命名空间

  • 首先,执行类语句的时候,会从头至尾执行其主体内的所有语句
  • 其次,是在执行过程中的赋值运算会在这个类作用域中创建变量名,从而成为对应的类对象属性
  • 与函数相比,可以把class语句看成一个本地作用域,在class语句下定义的变量就属于这个本地作用域
  • 与模块相比,定义的变量名是可以共享的并且成为当前类的对象属性

class语句一般形式

## 根据上述所言,className是类对象的一个引用
class className(superclass1,superclass2,...):          '''定义类属性,属于所有实例的共享数据,通过类语句下进行定义和创建'''class_attr = value '''定义实例方法以及实例属性'''def method(self,data):      ## 定义实例方法self.attr = data        ## 设置实例属性,通过带有self的方法来分配属性信息复制代码

2.方法

实例方法对象调用等价于类方法函数调用

## python自动将实例方法的调用自动转成类方法函数,并传递实例对象作为第一个参数传递
class Person:def study(self,name):print("%s study method in for %s" % (name,self.__class__.__name__)>>> p = Person()
>>> p.study("keithl")
keithl study method in for Person>>> Person.study(p,"keithl")
keithl study method in for Person## instance.method(arg1,arg2,...) == class.method(instance,arg1,arg2,...)复制代码

调用超类的构造函数__init__方法

class Person:def __init__(self):print("call person init ....")class Student(Person):pass>>> s = Student()               ## 创建子类时会调用父类构造函数,原因是子类没有定义自己的构造函数
call person init ....## 为子类增加构造函数
class Student(Person):def __init__(self):print("call student init ....")>>> s = Student()               ## 只输出子类的__init__方法,并没有调用父类方法,原因在于python是根据命名空间来执行调用方法
call student init ....## 若要调用父类构造方法则必须显示进行调用
class Student(Person):"""必须在子类构造函数中显式调用父类的构造函数,并传递子类的self引用"""def __init__(self):print("call student init start....")Person.__init__(self)              print("call student init end....")>>> s = Student()
call student init start....
call person init ....
call student init end....复制代码

静态方法

  • 使用场景:

    • 目标:为所有类实例提供数据共享的类属性
    • 执行:通过类名称访问类属性
    • 优化:其一是使用OOP思想封装类属性而对外提供方法,其二是考虑扩展性,通过继承来定制
    • 落地:使用静态方法或者类方法,即不需要传递类对象self实例参数的方法
## person.py
class Person:num = 1"""定义一个没有带参数的普通方法"""def printNum():Person.num += 1print("the number is %s" % Person.num)printNum = staticmethod(printNum)                   ## 声明为静态方法"""定义一个带参数的普通方法,此参数为类对象参数"""def clsPrintNum(cls):Person.num += 1print("the number is %s" % Person.num)         clsPrintNum = classmethod(clsPrintNum)              ## 声明为类方法>>> Person.printNum()
the number is 2>>> Person.clsPrintNum()
the number is 3## person.py 使用装饰器来声明静态或类方法
class Person:num = 1    @staticmethoddef printNum():Person.num += 1print("the number is %s" % Person.num)    @classmethoddef clsPrintNum(cls):Person.num += 1print("the number is %s" % Person.num)复制代码

静态方法、类方法与实例方法

  • 类中带有实例对象self的参数传递的方法称为实例方法
  • 类中带有类对象cls的参数传递的方法并通过函数classmethod或者装饰器@classmethod声明的方法称为类方法
  • 类中没有实例对象self和类对象cls参数传递的方法,且通过staticmethod或装饰器@staticmethod什么的方法称为静态方法
class Person:    @staticmethoddef static_method():print("static method ...")    @classmethoddef class_method(cls):print("class method ....")def instance_method(self):print("instance method ...")'''python3.x可以调用下面的函数,可以说是静态方法,但严格意义上是属于类的一个行为方法,但是python2.x无法该方法'''def fn():print("just a fn,if py3.x,it is static method")## 总结:
1)在类中定义方法一定要规范化,明确是静态方法还是类方法抑或是实例方法
2)避免使用最后一种方式在类中定义方法复制代码

3.命名空间与作用域

  • 命名空间:用于记录变量的轨迹,key是变量名称,value是变量值,作用就是根据变量名称搜索变量

    • 使用无点号运算的变量名称(X),将根据LEGB(local/enclosing/global/builtin)作用域查找法则来搜索变量
    • 使用点号的属性名称(object.x)使用的是对象命名空间来搜索变量(对象:类的实例对象和类对象)
    • 有些作用域会对对象的命名空间进行初始化(模块和类)

无点号运算的变量名称

  • 赋值语句:在当前作用域创建或更改变量X,除非声明为全局变量
X = "global X"
def enclosing_fn():## global X             X = "enclosing fn"      ## 创建当前enclosing_fn的本地变量X如果没有声明为全局变量的话复制代码
  • 引用:根据LEGB作用域法则来搜索变量
X = "global X"
def enclosing_fn():X = "enclosing fn"      ## 如果注释此行,将打印全局的变量Xprint(X)def local_x()x = "local x"       ## 如果仅注释此行,将会打印嵌套的变量Xprint(x)local_x()复制代码

点号的属性变量名称

  • 赋值语句:在对应的对象命名空间中创建或修改属性名称X,即object.X = value
>>> p = Person()## 在对象实例的命名空间创建或更改属性名称name
p.name = "keithl"       ## 并无进行变量名称的搜索## 在类的命名空间中创建或更改属性名称name
Person.name = "keithl"  ## 并无进行变量名称的搜索复制代码
  • 引用

    • 基于类的对象引用:会在对象内搜索属性名称X,若没有找到则根据继承搜索来查找
    • 基于模块对象的引用:先导入模块,再从模块中读取X
>>> p = Person()
>>> p.name          ## 从对象命名空间开始按照继承树来搜索
>>> Person.name     ## 从类的命名空间开始按照继承树来搜索复制代码

命名空间字典

  • 模块的命名空间是以字典的形式实现的,并且可以由属性__dict__来显示
  • 类和对象可以看成一个带有链接的字典,属性点号就是字典索引运算,属性继承就是搜索链接的字典
    • 实例与类通过__class__属性链接
    • 类与超类通过__bases__属性链接,可以通过递归往上遍历超类
  • 都可以通过__dict__查看模块、类或者对象的属性信息

类与模块的关系总结

    • 调用类会创建新的对象
    • 由class来创建类对象
    • 通过调用来使用
    • 属于模块的一部分
  • 模块

    • 是数据和逻辑包
    • 通过py抑或其他语言来扩展
    • 必须导入才能使用

喜欢可以关注我个人公众号,持续更新工程师技术日常

python面向对象编程(2)相关推荐

  1. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  2. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  3. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  4. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  5. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

  6. python面向对象编程的优点-Python面向对象编程——总结面向对象的优点

    Python面向对象编程--总结面向对象的优点 一.从代码级别看面向对象 1.在没有学习类这个概念时,数据与功能是分离的 def exc1(host,port,db,charset): conn=co ...

  7. python编程基础是什么-Python面向对象编程基础解析(一)

    1.什么是面向对象 面向对象(oop)是一种抽象的方法来理解这个世界,世间万物都可以抽象成一个对象,一切事物都是由对象构成的.应用在编程中,是一种开发程序的方法,它将对象作为程序的基本单元. 2.面向 ...

  8. 【Python基础】Python 面向对象编程(上篇)

    我的施工计划图 已完成专题包括: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用专题 今天是面向对象编程的上篇:基础专题 Python 面向对象编程 ...

  9. Python 面向对象编程基础

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

  10. python面向对象编程138讲_Python面向对象编程简单讲解

    学习目标: 1-面向对象编程 2-类和对象 3-对象的属性和方法 4-类的特性 Python面向对象编程 一种编程程序的设计思想,把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.把计算机 ...

最新文章

  1. 完美解决vue项目中弹出框滑动时,内部页面也跟着滑动问题
  2. VC防止程序被多次运行 互斥体方法
  3. Wargame.kr_Web:already got
  4. MFc消息映射机制理解
  5. Android手机截屏
  6. FlightGear
  7. 自考多媒体计算机技术,自考多媒体计算机技术.doc
  8. 数值分析思考题 (钟尔杰版) 参考解答——第三章
  9. 简述74HC595功能
  10. 3D中的OBJ文件格式详解
  11. 公众平台 php,微信公众平台PHP开发(转载)
  12. wp:涅普冬令营(2021) 监听消息
  13. 故障树手册(Fault Tree handbook)(4)
  14. 脉冲宽度调制_20160121
  15. 【Android】实现九宫格展示图片+视频(仿QQ空间、微信朋友圈)
  16. oracle lag使用情景,lag函数用法
  17. 微信小程序的一级页面和二级页面设置
  18. 设计模式 - 行为型设计模式 - 观察者模式(Java)
  19. git push 卡住不动的解决
  20. 树莓派常用的软件(记录)

热门文章

  1. MAC OS 如何安装命令行工具:Command Line Tools
  2. 用 GDI 操作 EMF 文件(转)
  3. java与freemarker中map的遍历
  4. 大数据_Flink_数据处理_流处理API_Transform(2)_滚动聚合算子_keyBy_sum_min_max_minBy_maxBy---Flink工作笔记0030
  5. SVN工作笔记001---svn删除已经上传的文件
  6. Android学习笔记---Android利用Sqlite,并且用sql语言操作SQLite数据库
  7. Android学习笔记---文件的操作模式,各种模式之间的关系,以及沿用linux系统的安全性
  8. NLP之路-warm up
  9. fastadmin model关联模型 关联查询问题
  10. python编程(类变量和实例变量)