python面向编程;类的绑定与非绑定方法、反射、内置方法
本文目录:
一、类的绑定与非绑定方法
类中定义函数分为了两大类:
1. 绑定方法
特殊之处: 绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法: 在类中定义函数没有被任何装饰器修饰的情况下,默认就是绑定对象的
绑定给类的方法: 为类中定义函数添加一个装饰器classmethod,就是绑定类的 2. 非绑定方法
特殊之处: 非绑定方法就是一个普通函数,既不与类绑定又不与对象绑定,意味着类与对象都可以调用,但是无论谁来调用都是一个普通函数,没有自动传值效果
非绑定方法: 为类中定义函数添加一个装饰器staticmethod,就是非绑定方法
class Foo:
def func1(self):
print('func1',self) @classmethod
def func2(cls):
print('func2',cls) @staticmethod
def func3(x,y):
print('func3',x,y) obj=Foo()
#一.绑定给对象的方法
# 绑定给对象的,应该由对象来调,
obj.func1()
print(obj) # 绑定给对象的方法,类也可以调用,但是类调用就是一个普通函数,没有自动传值的效果
print(obj.func1)
print(Foo.func1)
Foo.func1(obj) #二.绑定给类的方法
# 绑定给类的,应该由类来调,
print(Foo.func2)
print(obj.func2)
Foo.func2()
obj.func2() #三.非绑定方法
print(obj.func3)
print(Foo.func3) obj.func3(1,2)
Foo.func3(1,3)
import settings class MySQL:
def __init__(self,ip,port):
self.id=self.create_id()
self.ip=ip
self.port=port def tell_info(self):
print('<%s:%s:%s>' % (self.id,self.ip, self.port)) @classmethod
def from_conf(cls):
return cls(settings.IP, settings.PORT) @staticmethod
def create_id():
import uuid
return uuid.uuid4() obj=MySQL('1.1.1.1',3306)
# obj1=MySQL('1.1.1.2',3406)
obj.tell_info()
# obj1.tell_info() # obj2=MySQL.from_conf()
# obj2.tell_info()
二、反射
什么是反射
反射的概念是由Smith在1982年首次被提出主要是指程序可以访问、监测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究,它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
pyhton面向对象中的反射:通过字符串的形式操作对象相关的属性,python中的一切事物解皆是对象(都可以使用反射)
四个可以实现自省的函数:hasattr\getattr\serattr\delattr
class MyClass():
e = 5
def __init__(self,x,y):
self.x = x
self.y = y def func1(self):
print(self.x + self.y) obj = MyClass("","")
# 判断类实例化对象中是否有z这个属性或方法名返回True或False
print(hasattr(obj,'z'))
print(hasattr(obj,'func1'))
# 对象调hasattr也可以查看类属性
print("obj有e这个属性",hasattr(obj,'e'))
hasattr
class MyClass():
e = 5
def __init__(self,x,y):
self.x = x
self.y = y def func1(self):
print(self.x + self.y) obj = MyClass("","") # 获取类实例化对象中的属性或方法,如果是存在方法返回该方法的对象,如果不存在就会报错
print(getattr(obj,"y"))
# 也可以通过类实例化对象获取类的e属性
print("对象获取类的属性",getattr(obj,"e"))
getattr
class MyClass():
e = 5
def __init__(self,x,y):
self.x = x
self.y = y def func1(self):
print(self.x + self.y) obj = MyClass("","") # setattr新增属性,参数(对象,属性,值)
setattr(obj,"z",3)
print(obj.__dict__)
# setattr新增方法,参数(对象,属性,值)
setattr(obj,'show_name',lambda self:self.y + "个傻逼")
print(obj.__dict__)
print(obj.show_name(obj))
# setattr修改原有的值
setattr(obj,"y","")
print(obj.__dict__)
print(obj.show_name(obj))
# 对象setattr修改类的属性,对象中的e值发生改变,可类中的e是不发生变化的还是5
setattr(obj,"e",10)
print("对象调用setattr修改类的属性e,用对象查看结果:",obj.__dict__)
print("对象调用setattr修改类的属性e,用类查看结果",MyClass.__dict__)
setattr
class MyClass():
e = 5
def __init__(self,x,y):
self.x = x
self.y = y def func1(self):
print(self.x + self.y) obj = MyClass("","") # delattr删除属性
delattr(obj,"z")
print(obj.__dict__)
# delattr删除方法
delattr(obj,'show_name')
print(obj.__dict__)
# delattr删除对象原有的属性
delattr(obj,"x")
print(obj.__dict__)
# delattr删除类原有的属性,对象中的e被删除调了,可类中的e还是存在的
delattr(obj,'e')
print("对象调用delattr删除类的属性e,用对象查看结果",obj.__dict__)
print("类调用delattr删除类的属性e,用对象查看结果",MyClass.__dict__)
delattr
'''
反射指的是通过字符串来操作属性
'''
class Foo:
def __init__(self,name,age):
self.name=name
self.age=age def tell_info(self):
print('%s:%s' %(self.name,self.age)) obj=Foo('egon',18) #hasattr
# print(hasattr(obj,'name')) #obj.name
# print(hasattr(obj,'tell_info')) #obj.tell_info #getattr
# res=getattr(obj,'name') #res=obj.name
# print(res)
# res=getattr(obj,'xxx',None)
# print(res) #setattr
# setattr(obj,'age',38)
# setattr(obj,'sex','male')
# print(obj.__dict__)
# print(obj.sex) #delattr
# delattr(obj,'name')
if hasattr(obj,'xxxxe'):
delattr(obj,'xxxxe')
# print(obj.__dict__)
三、内置方法
# print(isinstance([],list)) #type([]) is list
# class Foo:
# pass
# obj=Foo()
# print(isinstance(obj,Foo)) # issubclass()
# class Foo:
# pass
#
# class Bar(Foo):
# pass
# print(issubclass(Bar,Foo)) # __str__: 会在对象被打印时自动触发,然后将返回值返回给print功能进行打印
# class People:
# def __init__(self,name,age):
# self.name=name
# self.age=age
#
# def __str__(self):
# return '<%s:%s>' %(self.name,self.age)
#
# peo=People('egon',18)
# print(peo) #print(peo.__str__())
#
# l=list([1,2,3])
# print(l) # __del__: 会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源
# class Foo:
# def __del__(self):
# print('===>')
#
# obj=Foo()
# # del obj
# print('其他代码...') class Bar:
def __init__(self,x,y,filepath):
self.x=x
self.y=y
self.f=open(filepath,'r',encoding='utf-8')
def __del__(self):
# 写回收系统资源相关的代码
self.f.close() obj=Bar(10,20)
del obj
python面向编程;类的绑定与非绑定方法、反射、内置方法的更多相关文章
- python基础之反射内置方法元类
补充内置函数 isinstance(obj,Foo) # 判断obj是不是foo的实例 issubclass() # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...
- python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)
面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...
- python基础——4(数字、字符串、列表类型的内置方法介绍)
目录 一.可变与不可变类型 二.数字类型 三.字符串类型 四.列表类型 一.可变与不可变类型 可变类型:值改变,但是id不变,证明就是在改变原值,是可变类型 不可变类型:值改变,id也跟着改变,证明产 ...
- python基础编程: 函数示例、装饰器、模块、内置函数
目录: 函数示例 装饰器 模块 内置函数 一.函数示例: 1.为什么使用函数之模块化程序设计: 不使用模块程序设计的缺点: 1.体系结构不清晰,可主读性差: 2.可扩展性差: 3.程序冗长: 2.定义 ...
- python面向编程:面向对象、init、绑定方法、案例练习
一.类的定义 二.面向对象概念三.对象的使用四.__init__函数的使用五.绑定方法六.面向对象联系 一.类的定义 1.什么叫做类? 类就是分类,类型的意思,一堆具备相同特征和行为的事物的抽象概念 ...
- python全栈开发从入门到放弃之列表的内置方法
1.列表切片 l=['a','b','c','d','e','f'] print(l[1:5]) # 根据索引号来切片,但顾头不顾尾 ['b', 'c', 'd', 'e'] print(l[1:5: ...
- Python的内置方法
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...
- Python之路(第二十七篇) 面向对象进阶:内置方法、描述符
一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...
- Python之路(第二十五篇) 面向对象初级:反射、内置方法
[TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...
- Python学习day07 - Python进阶(1) 内置方法
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
随机推荐
- Java日志体系(三)commons-logging
1.1 简介 Apache Commons Logging,又名JakartaCommons Logging (JCL),它是Apache提供的一个通用的日志接口,它的出现避免了和具体的日志方案直接耦 ...
- CentOS7或CentOS8 开机自动启用网卡的设置方法
sudo nano /etc/sysconfig/network-scripts/ifcfg-enp0s3(p0s3是网卡,名字不同环境会有差异,输入时可按tab自动补全.) 将最后一行的 ONBOO ...
- golang 操作ceph object storage
ceph的object storage 提供了和amazon s3兼容的接口以供客户访问. 在ceph的官网上,可以看到它提供了多种语言的访问范本,例如python的(http://docs.ceph ...
- Python multiprocess模块(上)
multiprocess模块 一. Process模块介绍 1. 直接使用Process模块创建进程 (1)主进程和子进程 (2)if __name__ == "__main__" ...
- 使用robotframework做接口测试5——一个用例中调多个接口
凡是涉及一点点有接口关联的,都可能下一个接口需要上一个接口的某个返回值作为入参,最直接的例子,就是登录依赖.用接口做业务性的测试,也绝对离不开接口依赖的,业务都是一系列接口串联的结果,有时候一个接口操 ...
- [转帖]【架构系列】龙芯loongson简介
[架构系列]龙芯loongson简介 https://blog.csdn.net/SoaringLee_fighting/article/details/97759305 2019年07月30日 10 ...
- PAT A1011 World Cup Betting(20)
AC代码 #include <cstdio> #include <algorithm> const int max_n = 3; using namespace std; /* ...
- h5中的结构元素header、nav、article、aside、section、footer介绍
结构元素不具有任何样式,只是使页面元素的的语义更加明确. header元素 header元素是一种具有引导和导航作用的的结构元素,该元素可以包含所有通常放在页面头部的内容.header元素通常用来放置 ...
- MyBatis学习存档(2)——核心配置文件
一.xml节点结构 configuration为根节点 properties 可以配置在Java 属性配置文件中 settings 修改 MyBatis 在运行时的行为方式 typeAliases 为 ...
- QT目录模型QDirModel的使用(一个model同时连接tree,list,table)
3#include <QApplication>#include <QAbstractItemModel>#include <QAbstractItemView># ...