函数VS方法

从分类的角度来分析。

(1)函数的分类:

内置函数:python内嵌的一些函数。
匿名函数:一行代码实现一个函数功能。
递归函数
自定义函数:根据自己的需求,来进行定义函数。

(2)方法的分类:

普通方法:直接用self调用的方法。
私有方法:__函数名,只能在类中被调用的方法。
属性方法:@property,将方法伪装成为属性,让代码看起来更合理。
特殊方法(双下划线方法):以__init__为例,是用来封装实例化对象的属性,只要是实例化对象就一定会执行__init方法,如果对象子类中没有则会寻找父类(超类),如果父类(超类)也没有,则直接继承object(python 3.x)类,执行类中的__init__方法。
类方法:通过类名的调用去操作公共模板中的属性和方法。
静态方法:不用传入类空间、对象的方法, 作用是保证代码的一致性,规范性,可以完全独立类外的一个方法,但是为了代码的一致性统一的放到某个模块(py文件)中。

从作用域的角度来分析:

(1)函数作用域:从函数调用开始至函数执行完成,返回给调用者后,在执行过程中开辟的空间会自动释放,也就是说函数执行完成后,函数体内部通过赋值等方式修改变量的值不会保留,会随着返回给调用者后,开辟的空间会自动释放。

(2)方法作用域:通过实例化的对象进行方法的调用,调用后开辟的空间不会释放,也就是说调用方法中对变量的修改值会一直保留。

调用的方式不同。

(1)函数:通过“函数名()”的方式进行调用。

(2)方法:通过“对象.方法名”的方式进行调用。

class Foo(object):def func(self):pass

判断函数与方法的方式

print()

(1)print(func) # *<function func at 0x00000000005D1EA0>

(2)obj = Foo()

print(obj.func) # <bound method A.func of <main.A object at 0x0000000001DE1CF8>>

types模块

from types import FunctionType
from types import MethodTypedef func():passclass A:def func(self):pass@staticmethoddef f():pass
# print(isinstance(func, FunctionType))
# print(isinstance(func, MethodType))# 类名调用func 就是一个函数
# print(isinstance(A.func, FunctionType))
# print(isinstance(A.func, MethodType))
# obj = A()
# 对象调用func 就是一个方法
# print(isinstance(obj.func, FunctionType))
# print(isinstance(obj.func, MethodType))# 对于静态方法的研究
# print(isinstance(A.f, FunctionType))
# print(isinstance(A.f, MethodType))# obj = A()
# # 对象调用func
# print(isinstance(obj.f, FunctionType))
# print(isinstance(obj.f, MethodType))# 函数与方法
# 函数: 全都是显性传参
# 方法: 存在隐性传参

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

从实例的角度研究反射(4个反射函数)

class Foo:static_field = '静态属性'def __init__(self, name, age):self.name = nameself.age = agedef func(self):print('in A func')
obj=Foo('egon',73)#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))#获取属性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()print(getattr(obj,'aaaaaaaa','不存在啊')) #报错#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错print(obj.__dict__)

从类的角度研究反射

class Foo(object):staticField = "old boy"def __init__(self):self.name = 'wupeiqi'def func(self):return 'func'@staticmethoddef bar():return 'bar'print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')

当前模块的反射

import sysdef s1():print 's1'def s2():print 's2'this_module = sys.modules[__name__]hasattr(this_module, 's1')
getattr(this_module, 's2')

其他模块的反射

#一个模块中的代码
def test():print('from the test')
"""
程序目录:module_test.pyindex.py当前文件:index.py
"""
# 另一个模块中的代码
import module_test as obj#obj.test()print(hasattr(obj,'test'))getattr(obj,'test')()

反射的作用

学反射前:

class User:def login(self):print('欢迎来到登录页面')def register(self):print('欢迎来到注册页面')def save(self):print('欢迎来到存储页面')while 1:choose = input('>>>').strip()if choose == 'login':obj = User()obj.login()elif choose == 'register':obj = User()obj.register()elif choose == 'save':obj = User()obj.save()

学反射后

class User:def login(self):print('欢迎来到登录页面')def register(self):print('欢迎来到注册页面')def save(self):print('欢迎来到存储页面')user = User()
while 1:choose = input('>>>').strip()if hasattr(user,choose):func = getattr(user,choose)func()else:print('输入错误。。。。')

转载于:https://www.cnblogs.com/Jacob-yang/p/11191765.html

Python之面相对象 - 函数VS方法 反射相关推荐

  1. Python之面相对象 - 双下方法

    双下方法 定义:双下方法是特殊方法,他是解释器提供的 由爽下划线加方法名加双下划线 __方法名__的具有特殊意义的方法,双下方法主要是python源码程序员使用的,我们在开发中尽量不要使用双下方法,但 ...

  2. Python之面相对象-封装 多态 约束 super()

    面向对象之:三大特性:继承(已讲),封装,多态. 前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对 ...

  3. Python列表操作常用函数、方法大全

    目录 简介 列表基本方法 访问列表元素(即索引) index方法 enumerate()函数 在列表中添加元素 append方法 insert方法 修改列表元素 删除列表元素 del语句 pop()函 ...

  4. python调用C语言函数(方法)的几种方法

    1. 使用ctypes 可能是Python调用C方法中最简单的一种 2. 使用SWIG 是Python中调用C代码的另一种方法.在这个方法中,开发人员必须编写一个额外的接口文件来作为SWIG的入口. ...

  5. python进制转换函数及方法

    python进制转换函数 一.通过int函数实现其他进制转十进制 假设 M 为某已知进制字符串 n 的进制数 result = int(n,M) --------------------------- ...

  6. python编程内置函数使用方法_python编程(4)--内置函数

    ​     函数,通常称为方法,是一种将自变量到因变量的映射(y = f(x)).在python里用def或者lambda去构造,语法如下. def f(x):      #x -- 输入 y = x ...

  7. python编程内置函数使用方法_Python内置函数 next的具体使用方法

    Python 3中的File对象不支持next()方法. Python 3有一个内置函数next(),它通过调用其next ()方法从迭代器中检索下一个项目. 如果给定了默认值,则在迭代器耗尽返回此默 ...

  8. 8.python之面相对象part.6(python面向对象之封装的概念)

    一.什么是封装? 对于什么是封装,我找到了一个很好的例子...就不在这里做解释了,以下内容来源于峰氏理论...与博主无关.... (下面内容转载自egon的博客) 你钱包的有多少钱(数据的封装) 你的 ...

  9. python——类和对象之__str__方法的使用

    用于返回一个对于"对象的描述",对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对__str__()方法进行重写 运行结果为: 同学的名字k ...

最新文章

  1. SAP QM 检验批上的‘容器数’
  2. DLL内线程同步主线程研究(子线程代码放到主线程执行)
  3. 非线性回归模型(part1)--神经网络
  4. 唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题
  5. jdom编写xml自动缩进_Spring Beans 自动装配
  6. 矩阵连乘最佳加括号方式-动态规划算法
  7. python提取文字的轮廓_opencv 轮廓提取文字
  8. 整理springmvc+mybatis+velocity的整合一
  9. 【centos】安装wget------转发自【小姜dot】
  10. 蓝牙技术|蓝牙Mesh照明技术照亮世界
  11. 自动驾驶仿真软件SCANeR studio(三)terrain地形模式
  12. 用定制标签库和配置文件实现对JSP页面元素的访问控制
  13. [转载]你有英文名字吗?给自己起一个吧
  14. Linux下如何拷贝隐藏文件
  15. append,extend和insert的区别
  16. 用java代码写的段子_网上调侃程序员的段子
  17. Visual C++从入门到精通(第3版)光盘
  18. 电信号码停机查询本机号码
  19. ES mget、bulk、mappings
  20. 面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)

热门文章

  1. 方寸知识篇 — 芯片的失效机理
  2. linux --- 2.常用命令 , python3, django安装
  3. vue修改数组中的数据7个方法
  4. springboot项目集成了mybatis之后编译报错
  5. crmebpro公众号+H5+小程序+PC+APP+DIY自由设计+多门店
  6. 常见的机器学习数据挖掘知识点之Basis
  7. 元宇宙中的手势交互(四)第一款主流VR头显中的手势交互原理剖析(Meta Quest 2)
  8. Redis实现商品秒杀
  9. 【斐波拉契数列】 Python
  10. java大数类阶乘_Java中的大数阶乘