一、函数和方法

1.函数和方法的区别

函数: 全都是显性传参,手动传参,与对象无关

方法: 存在隐性传参,与对象有关

1.1通过函数名可以判断

len()就是函数
str.count()就是方法 def func():
pass
class A:
def func(self): print(func)
obj = A()
print(obj.func())

2.2通过types模块判断

from types import functionType
from types import MethodType
print(isinstance(func,FunctionType))
print(isinstance(func,MethodType))
  • 类名调用func就是一个函数
  • 对象调用func就是一个方法

2.3 对于静态方法的研究

print(isinstance(A.f, FunctionType)) #指的是函数类型
print(isinstance(A.f, MethodType)) #类方法

二、反射

有什么用

有些时候你明明知道一个变量的字符串数据类型的名字,你想调用它,但是调不到,就可以使用反射

反射方法

通过字符串去操作一个对象

getattr 获取一个属性或者方法
getattr(obj,'name1',None) #前面是类名,后面是字符串形式的属性或方法 hasattr 判断属性或方法是否存在
hasattr(obj,'name') setattr 设置新的属性
setattr(obj,'hobby', '玩') hasattr 删除属性
hasattr(obj, 'func')

对实例化对象的反射

前面是实例化对象名,后面是字符串形式的实例化对象的属性

class Foo:
f = '类的静态变量' def __init__(self, name, age):
self.name = name
self.age = age def say_hi(self):
print(f'hi,{self.name}') obj = Foo('egon', 73) # 检测是否含有某属性 name
print(hasattr(obj, 'name'))
print(hasattr(obj, 'say_hi')) # 获取属性
n = getattr(obj, 'name') # 等同于 obj.name
print(n)
func = getattr(obj, 'say_hi')
func() # print(getattr(obj, 'aaaaaaaa', '不存在啊')) # 报错 # 设置属性
setattr(obj, 'sb', True) # 等同于 obj.sb = True
setattr(obj, 'show_name', lambda self: self.name + 'sb')
print(obj.__dict__)
print(obj.show_name(obj)) # 删除属性
delattr(obj, 'age') # 等同于 del 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' @staticmethod
def bar():
return 'bar' print(getattr(Foo, 'staticField')) # 前面是类名,后面是类的属性或方法
print(getattr(Foo, 'func'))
print(getattr(Foo, 'bar'))

对当前模块的反射

import sys

def s1():
print('s1') def s2():
print('s2') this_module = sys.modules[__name__] # 比较推荐#sys.modules 获得到的是 当前文件的所有属性及方法,返回是一个字典
# 等同于 this.module = sys.modules["__main__"] hasattr(this_module, 's1')
getattr(this_module, 's2')()

对其他模块的反射

"""
程序目录:
module_test.py
index.py
""" # module_test.py 中的代码
def test():
print('from the test') # index.py 中的代码
import module_test as obj # obj.test() print(hasattr(obj, 'test')) getattr(obj, 'test')()
class A:

    static_field = '静态属性'

    def __init__(self, name, age):
self.name = name
self.age = age def func(self):
print('in A func') obj = A('MC骚Q', 18)
print(obj.name)
#
print(hasattr(obj,'name')) # ***
print(getattr(obj,'name1',None)) ***
setattr(obj,'hobby', '玩') *
print(getattr(obj,'hobby'))
print(obj.hobby)
delattr(obj,'name') *
print(hasattr(obj,'name'))
if hasattr(obj, 'static_field'):
print(getattr(obj,'static_field')) if hasattr(obj, 'func'):
# print(getattr(obj,'func'))
getattr(obj,'func')()

三、双下方法

__len__

用途

​ 可以获取类中属性个数,如__init__

格式

def __len(self):
print('触发__len__方法')
return 10

触发方法

len(obj)

一个对象之所以可以使用len()函数,根本原因是你这个对象从输入的类中有__len__方法,方法其实执行的是 len 当类中没有__len__ 这个方法时,使用len()就会报错

__hash__

用途

哈希

触发方法

print(hash(obj))

__str__方法

用途

​ 打印输出

触发方法

print(obj)

__repr__方法

用途

​ 同__str__一样,与str同时存在的时候,str的优先级要高

触发方法

print(此对象是%r那就先执行repr的方法)

__call__方法

触发方法

obj() #对象加括号触发就会触发类里面的__call__方法

__eq__方法

用途

​ 当你对一个类中的两个对象比较操作的时候,就会触发__eq__方法

__del方法

有什么用

​ 对象引用为零的时候, 析构方法,主动删除

​ 从内存中删除,垃圾回收机制♻️

调用方法

l2 = [1,2,3]
dic = {1:22, 2:33}
del l2
del dic #主动删除

__new__(*****************)

用什么用

  • 构造一个对象出来(自动执行__init__文件的时候就是__new__在干这件事儿)
  • 创建构建并返回一个新的空间
class A(object):

    def __init__(self):
print('in __init__')
def __new__(cls, *args, **kwargs):
print('in __new__')
object1 = object.__new__(cls)
return object1
obj = A()
# 输出结果
in __new__
in __init__

单例模式

单例模式单例模式就是一种设计模式,一个类智能实例化一个对象,无论你实例化多少次,内存中都只有一个对象,目的是为节省 空间

面试几乎都会让你手写一个单例模式

class A:
__instance = None def __new__(cls, *args, **kwargs):
if not cls.__instance:
object1 = object.__new__(cls)
cls.__instance = object1
return cls.__instance
obj = A()
obj1 = A()
obj2 = A()
obj3 = A()
print(obj, obj1, obj2, obj3)

__item__方法

用途

对对象进行类似于字典的操作

__getitem__、__setitem__、__delitem__、

class Foo:
def __init__(self, name):
self.name = name def __getitem__(self, item):
print(item)
print('get时 执行我') def __setitem__(self, key, value):
self.name = value
print('set时执行我') def __delitem__(self, key):
print(f'del obj{[key]}时,我执行') obj = Foo('御姐')
# obj.__dict__
# obj['name']
# obj['name'] = '萝莉'
# print(obj.name)
del obj['name'] class Foo:
def __init__(self, name, key, value):
self.name = name self.dict = {}
self.dict[key] = value def __getitem__(self, key):
print("1313", self.dict[key])
# return self.dict[key] def __setitem__(self, key, value):
self.__dict__[key] = value
print(key, "创建新的键值对") def __delitem__(self, key):
print('del obj[', key, ']时,我执行')
self.__dict__.pop(key) def __delattr__(self, item):
print('del obj.', item, '时,我执行')
self.__dict__.pop(item) f1 = Foo("sb", "A", "1")
f1["A"] # 会去执行 __getitem__ 方法
f1['age'] = 18 # 会去执行 __setitem__ 方法
f1['age'] = 112 # 修改也会去执行 __setitem__ 方法
f1['age1'] = 250 # 修改也会去执行 __setitem__ 方法
del f1.age1 # 会去执行 __delattr__ 方法
del f1['age'] # 会去执行 __delitem__ 方法
f1['name'] = 'alex' # 会去执行 __setitem__ 方法
print(f1.__dict__)

利用类方法的认证功能***

class Auth:

    function_list = [('login','请登录'),('register','请注册'),('exit_q','退出')]

    def login(self):
print('欢迎登录') def register(self):
print('欢迎注册') def exit_q(self):
print('退出程序')
exit() while 1:
obj = Auth()
for num,option in enumerate(obj.function_list,1):
print(num,option[1]) try:
choice_num = input('请输入选择: ').strip()
if hasattr(obj,obj.function_list[int(choice_num)-1][0]):
getattr(obj,obj.function_list[int(choice_num)-1][0])()
except IndexError:
print('请输入超过范围')
except ValueError:
print('请输入数字')

python之面向对象函数与方法,反射,双下方法的更多相关文章

  1. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  2. Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究

    Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: ​ 反射的概念是由Smith在1982年首次提出的 ...

  3. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  4. Python面向对象之反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  5. python之路-双下方法

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

  6. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

  7. python 面向对象专题(六):元类type、反射、函数与类的区别、特殊的双下方法

    目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3. 函数与类的区别 4. 特殊的双下方法 1. 元类type type:获取对象 ...

  8. day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法

    day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...

  9. Python面向对象 | 双下方法

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

随机推荐

  1. 关于Linux文件系统

    前言 文件系统是在内核中实现,能够对存储在磁盘上的二进制数据进行有效的层次化管理的一种软件.而用户程序为了实现在磁盘上使用或者创建文件,向内核发起系统调用(实际由文件系统向内核发起的系统调用)并转换为 ...

  2. Grafana+Prometheus监控mysql性能

    #cmd /usr/local 今天讲一下如何监控服务器中的mysql数据库的性能 一.数据库操作 1.mysql启动 #service mysqld start #启动数据库 #service my ...

  3. nginx 命令行参数 启动 重启 重载 停止

    今天和大家分享关于 nginx 的一些参数使用 首先,你应该安装了nginx CentOS 安装 nginx 这是很早之前的一篇博客,可以参考. 之前,我们如何去操作 nginx ##简单粗暴法 pk ...

  4. go微服务框架kratos学习笔记十(熔断器)

    目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...

  5. 配置github——每次提交后使contributions有记录(有小绿格子)

    # 配置github--每次提交后使contributions有记录(有小绿格子) 这几天都有将自己的代码提交到github上,但是在profile里的contributions的表格中没有我提交的记 ...

  6. phpstudy渗透到服务器

    0x00 目标站点www.test.ichunqiu 0x01 尝试登陆系统 -尝试弱密码登陆 结果:forbidden!!! -尝试万能账号密码登陆 1‘ or 1=1--+ 和 1‘ or 1=1 ...

  7. jdk1.5之后,classpath不需要再配置

    1.5之后更智能了. 设置了classpath之后,当前目录失效(在classpath中没找到就报错,不会再在当前目录继续找),所以要把当前目录添加到classpath,永久环境变量添加 .,临时环境 ...

  8. Echarts 自定义legend图片,修改点击之后的颜色图解

    第一个问题:echarts 可以自定义图例的图标,百度上很多回答都是引用的相对路径,但是不知道为啥,我的vue项目就是引用不显示,在network里面找不到相应图片 后来我想了个法子,就是先获取到这个 ...

  9. Fortify Audit Workbench 笔记 SQL Injection SQL注入

    SQL Injection SQL注入 Abstract 通过不可信来源的输入构建动态 SQL 指令,攻击者就能够修改指令的含义或者执行任意 SQL 命令. Explanation SQL injec ...

  10. Flask 使用pycharm 创建项目,一个简单的web 搭建

    1:新建项目后 2:Flask web 项目重要的就是app 所有每个都需要app app=Flask(__name__)   3:Flask 的路径是有app.route('path')装饰决定, ...