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- ...
随机推荐
- liunx 中如何删除export设置的环境变量
1,网上有资料说,export命令添加的环境变量,利用export -p 删除: 例如:export KUBECONFIG="/etc/kubernetes/admin.conf" ...
- 打开svn时出现 R6034
An application has made an attempt to load the C runtime library...... 最后发现是因为环境变量path里面有:E:\anacond ...
- python基础知识(字典)
创建字典 变量名 = {key:value,.....} zip() 转换为zip对象 空字典 变量名 = {} 变量名 = dict(key = value,....) 创建只有键的字典 fr ...
- 转 - JS 中 call 和 apply 以及 bind 的区别
转自 https://blog.csdn.net/wyyandyou_6/article/details/81488103
- Leetcode之动态规划(DP)专题-486. 预测赢家(Predict the Winner)
Leetcode之动态规划(DP)专题-486. 预测赢家(Predict the Winner) 给定一个表示分数的非负整数数组. 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端 ...
- hdoj1011(树上分组背包)
题目链接:https://vjudge.net/problem/HDU-1011 题意:给定一颗树,每个结点有两个属性,即花费V和价值w,并且选择子结点时必须选择父结点,求总花费不超过m的最大价值. ...
- 小记--------spark的两种提交模式
spark的两种提交模式:yarn-cluster . yarn-client 图解
- SQLite基础-8.子句(二)
目录 SQLite子句(二) 1. GROUP BY子句 2. HAVING子句 3. LIMIT 子句 4. IF EXISTS 和 IF NOT EXISTS 子句 SQLite子句(二) 1. ...
- 终于有人把“TCC分布式事务”实现原理讲明白了
所以这篇文章,就用大白话+手工绘图,并结合一个电商系统的案例实践,来给大家讲清楚到底什么是 TCC 分布式事务. 首先说一下,这里可能会牵扯到一些 Spring Cloud 的原理,如果有不太清楚的同 ...
- PAT B1028 人口普查(20)
课本AC代码 #include <cstdio> struct person { char name[10]; int yy, mm, dd; } oldest, youngest, le ...