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- ...
随机推荐
- Markov logic network
A Markov logic network (or MLN) is a probabilistic logic which applies the ideas of a Markov network ...
- 前端学习(一) body标签(上)
body标签中相关标签 主要内容: 字体标签: h1~h6.<font>.<u>.<b>.<strong><em>.<sup> ...
- js 笔记整理
Js中for.for-in.forEach以及for-of的用法及特性对比 for-in for...in以任意顺序遍历一个对象的可枚举属性.所以for-in不适合用来迭代一个Array.同时,for ...
- something about gdb
1 gdb 基础命令 b(break): 添加断点 r(run): 重头开始运行程序 n(next): 下一步 c(continue): 程序继续运行,直到下一处断点,或者程序运行到结束 q ...
- Python3 Selenium自动化web测试 ==>FAQ:隐式等待和sleep区别
FAQ: 情景1: 设置等待时间 A方法:sleep 线程休眠,但只单次有效,其他操作需要加载等待时间,需要再次添加time.sleep() B方法:implicitly_wait() from se ...
- Git速成学习第一课:创建版本库与版本回退
Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 我太困了0.0精神点再写...... /*我来啦!以后会陆续更新自己的学习笔记*/ Git是分布 ...
- C++调用windowsAPI
1.需要#include <windows.h>http://zhidao.baidu.com/link?url=yOeEGkhe3-kVI6rCqyNp14IjTyXBkQhLeNt-X ...
- lua的table库中的常用函数总结
table是Lua语言中的一种重要的数据类型, table 的一些特性简单列举如下: (1).table 是一个“关联数组”,数组的索引可以是数字或者是字符串; (2).table 的默认初始索引一般 ...
- jinfo 命令
NAME jinfo - Generates configuration information. SYNOPSIS jinfo [ option ] pid 示例:jinfo 3245
- POJ1703Find them, Catch them 【种类并查集】
题目链接:http://poj.org/problem?id=1703 题目大意:给n个人,m次询问.A代表询问a, b之间的关系,D代表给出a, b属于不同的帮派. 我的想法: 太菜了,上课的时候没 ...