函数装饰器

对于某个函数,如果我们希望在不改变该函数代码的前提下,为该函数增加额外的功能,那么就可以使用装饰器来装饰该函数。
装饰器是一个函数,装饰器接收一个函数作为参数(传入的实参是被装饰的函数)
装饰器的内部嵌套定义另一个函数,内函数中会引用装饰器的参数,并且装饰器的返回值是内函数。
为了让内函数接收任意类型的参数,将内函数的形参定义为(*args,**kwargs)
在函数中,首先完成为被装饰函数添加的新功能,然后调用被装饰的函数。
把装饰器应用到被装饰函数的语法为:在被装饰函数的前面添加“@装饰器的函数名”
def notice(func):def wrapper(*args,**kwargs):print("公告:注意身体!")return func(*args,**kwargs)return wrapper
@notice
def add(a,b):return a + b
@notice
def subt(a,b):return a - b
print(add(3,5))
>公告:注意身体!8
print(subt(8,3))
>公告:注意身体!5

类方法

类方法指的是类对象中使用装饰器@classmethod进行装饰的方法
在类对象中定义类方法时,必须使用装饰器@classmethod进行装饰,此外,第一个形参表示类对象,其对应的实参由系统自动传入。第一个形参的名称通常是cls。
类对象可以被类对象所调用,语法格式为:类对象.方法名([实参])或:cls.方法名([实参])。
类对象也可以实例对象所调用,语法格式为:实例对象.方法名([实参])或:self.方法名([实参])。
class MyClass(object):
#在类对象中定义类方法@classmethoddef class_func(cls,a,b):print(a,b)
#通过类对象调用类方法
MyClass.class_func('hi','hello!')
>hi hello!
#通过实例对象调用类方法
mc = MyClass
mc.class_func(1,2)
>1 2
PS:可以用实例对象调用类方法,但是不能用类对象调用实例方法

静态方法

类对象的静态方法只是一个普通函数,把某个普通函数归属于类对象,可能只是为了易于代码管理。在类对象中定义静态方法时,必须使用装饰器@staticmethod进行装饰
静态方法 只是一个普通函数,因此,第一个形参没有特殊含义和要求。
静态方法可以被类对象所调用,语法格式为:类对象.方法名([实参])或:cls.方法名([实参])。
静态方法也可以实例对象所调用,语法格式为:实例对象.方法名([实参])或:self.方法名([实参])。
调用静态方法时的参数传递与调用普通函数是一样的。
class MyClass(object):@staticmethoddef sm(p1,p2):print(p1,p2)
MyClass.sm(1,2)
>1 2
mc = MyClass()
mc.sm(1,2)
>1 2

访问控制

访问控制指的是:控制类对象的属性和方法在类对象的外部是否可以直接访问。
如果在类对象的某个属性或方法前添加两个下划线__,那么在类对象的外部就不能直接访问该属性或方法了。
class MyClass(object):def __init__(self):self.__pia = 18def __pim(self):print("__pim()被调用了")
mc = MyClass()
print(mc.__pia)
>#报错
>---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-229fd1431afb> in <module>()5         print("__pim()被调用了")6 mc = MyClass()
----> 7 print(mc.__pia)AttributeError: 'MyClass' object has no attribute '__pia'
mc.__pia()
>#报错
>---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-a65b2ec13347> in <module>()
----> 1 mc.__pia()AttributeError: 'MyClass' object has no attribute '__pia'
print(mc._MyClass__pia)
>18
mc._MyClass__pim()
>__pim()被调用了
仍然可以在类对象的外部动态绑定名为__xxx的属性或方法,这与类对象内部名为__xxx的属性或方法是不同的。
mc.__pia = "hi"
print(mc.__pia)
>hi
print(dir(mc))
>['_MyClass__pia', '_MyClass__pim', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__pia', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'do_sth']
除了在类对象的属性或方法前添加两个下划线__,还可以在类对象的属性或方式前添加单下划线_,这表示:虽然可以在类对象的外部访问该属性或方法,但是最好不要访问。

面向对象编程 object oriented programming(OOP)(第二篇)相关推荐

  1. SystemVerilog HVL:面向对象编程(Object Oriented Programming, OOP)

    目录 1. 封装 1.1. 构造函数 new 与句柄 1.2. 调用句柄 1.3. 静态属性 与 静态方法 1.4. 权限(local和protected) 2. 继承 2.1. 子类的构造函数 3. ...

  2. Python编程基础:第三十九节 面向对象编程Object Oriented Programming

    第三十九节 面向对象编程Object Oriented Programming 前言 实践 前言 到目前为止我们都是函数式编程,也即将每一个功能块写为一个函数.其实还有一种更常用的编程方式被称为面向对 ...

  3. 面向对象编程 object oriented programming(OOP)

    面向对象编程,是一种编程方式,这种编程方式需要使用"对象"来实现 对象的特征 世间万物皆对象 每个对象都是唯一的 对象具有属性和行为(对象的行为包括具有的功能及具体的实现) 对象具 ...

  4. BioPython ② | 面向对象编程Object Oriented Programming

    BioPython ② | Python面向对象编程 题目要求 定义分子类(Molecule)作为基类,包含集合elements和weight作为其属性,用初始化函数,将elements初始化为空集, ...

  5. python, 面向对象编程Object Oriented Programming(OOP)

    把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数 ...

  6. Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming)

    Java SE 008 理解面向对象程序设计 (Inside Object Oriented Programming) 前言:此笔记为圣思园张龙老师讲述的java视频课程笔记,自己看视频学习时记录的, ...

  7. 面向对象编程(Object Oriented Programming)概念总结及延伸(一)

    1.介绍 笔者的梦想是成为一个架构师,但是要成为一个合格的架构师是相当不易的,它既需要丰富的项目经验也需要不断地吸取新的知识,而且在这过程中我们也要不断巩固基础知识.我也注意到了,现在主流的文章大都集 ...

  8. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  9. Object Oriented Programming面向对象编程

    OOP 面向对象编程( Object Oriented Programming)是一种 计算机编程 架构.OOP 的一条基本原则是 计算机程序是由单个能够起到子 程序作用的单元或 对象组合而成.OOP ...

最新文章

  1. 搜索插入位置的golang实现
  2. easyui treegrid 获取新添加行inserted_18行JavaScript代码构建一个倒数计时器
  3. 人工智能正在推动芯片的复兴
  4. 牛客网刷题(纯java题型 181~210题)
  5. [LeetCode][Java] 3Sum Closest
  6. Python基础 基本数据类型
  7. 源码解析 Netty Channel接口及其实现类
  8. WebDriver 小毛笔记(二)准备工作
  9. pyqt5 python2.7_python2.7 安装pyqt5
  10. java velocity 语法_Velocity 语法
  11. WBE15_HttpServletRequest
  12. bat计算机清理原理,如何一键清除系统垃圾bat,教您如何清理
  13. 计算机和信息系统安全保密管理规定,图文信息中心 计算机信息系统安全保密管理规定...
  14. 分组卷积和空洞卷积总结
  15. oc宏定义的简单理解
  16. MATLAB中的resample函数根本理解,我专栏中有Guitar.MAT资源
  17. 上计算机课为什么戴鞋套,为什么当年进电脑机房要戴鞋套!
  18. 关于人工智能不会使大脑变懒惰的议论文_自律,拒绝懒惰和放纵,不枉余生
  19. LOJ 6485 LJJ学多项式
  20. 守护线程(Daemon)、钩子线程(Hook)简述

热门文章

  1. js文件中加载其他js文件
  2. Beautiful Array
  3. mysql删除有关联的数据库表_【数据库】mysql如何删除关联表
  4. 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信
  5. Pig 0.12.1安装和使用
  6. Python实训day11am【大作业思路梳理】
  7. Matlab图像处理创新实践-实验4【综合设计大实验——GUI综合设计】
  8. CentOS 初体验二十四:redis常用命令:Set
  9. Java IO流学习总结六:ByteArrayInputStream、ByteArrayOutputStream
  10. linker command failed with exit code 1 解决