本文目录:

一、类的绑定方法与非绑定方法

二、反射

三、内置方法

一、类的绑定与非绑定方法

类中定义函数分为了两大类:
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面向编程;类的绑定与非绑定方法、反射、内置方法的更多相关文章

  1. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  2. python面向对象的基础语法(dir内置函数、self参数、初始化方法、内置方法和属性)

    面相对象基础语法 目标 dir 内置函数 定义简单的类(只包含方法) 方法中的 self 参数 初始化方法 内置方法和属性 01. dir 内置函数(知道) 在 Python 中 对象几乎是无所不在的 ...

  3. python基础——4(数字、字符串、列表类型的内置方法介绍)

    目录 一.可变与不可变类型 二.数字类型 三.字符串类型 四.列表类型 一.可变与不可变类型 可变类型:值改变,但是id不变,证明就是在改变原值,是可变类型 不可变类型:值改变,id也跟着改变,证明产 ...

  4. python基础编程: 函数示例、装饰器、模块、内置函数

    目录: 函数示例 装饰器 模块 内置函数 一.函数示例: 1.为什么使用函数之模块化程序设计: 不使用模块程序设计的缺点: 1.体系结构不清晰,可主读性差: 2.可扩展性差: 3.程序冗长: 2.定义 ...

  5. python面向编程:面向对象、init、绑定方法、案例练习

    一.类的定义 二.面向对象概念三.对象的使用四.__init__函数的使用五.绑定方法六.面向对象联系 一.类的定义 1.什么叫做类? 类就是分类,类型的意思,一堆具备相同特征和行为的事物的抽象概念 ...

  6. python全栈开发从入门到放弃之列表的内置方法

    1.列表切片 l=['a','b','c','d','e','f'] print(l[1:5]) # 根据索引号来切片,但顾头不顾尾 ['b', 'c', 'd', 'e'] print(l[1:5: ...

  7. Python的内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  8. Python之路(第二十七篇) 面向对象进阶:内置方法、描述符

    一.__call__ 对象后面加括号,触发执行类下面的__call__方法. 创建对象时,对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()( ...

  9. Python之路(第二十五篇) 面向对象初级:反射、内置方法

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

  10. Python学习day07 - Python进阶(1) 内置方法

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. Java数组(1):数组与多维数组

    我们对数组的基本看法是,你可以创建它们,通过使用整型索引值访问它们的元素,并且他们的尺寸不能改变. 但是有时候我们需要评估,到底是使用数组还是更加灵活的工具.数组是一个简单的线性序列,这使得元素访问非 ...

  2. 使用rabbit mq.模拟dubbo,使MQ异步调用代码写起来像是同步方法.

    最近在改造老系统,遇到了需要使用rabbitMq的场景.在以前使用的过程中需要在发送端和消费端各种配置,感觉比较麻烦,然后突然想到了dubbo中@Reference注解的形式,可不可以做一个类似的架子 ...

  3. 第四章 信息收集之nmap

    @nmap扫描工具 nmap是使用最广泛的扫描工具,主要的使用范围有,嗅探,扫描,ping. 局域网扫描 nmap扫描的基本命令: 首先在桌面右键选择open in terminal进入命令窗口,输入 ...

  4. android#嵌入式布局并创建自定义控件

    一.如何在android中嵌入布局文件: 新建一个布局title.xml,该文件为公共文件 <LinearLayout xmlns:android="http://schemas.an ...

  5. 【AMAD】django-cities -- 为Django项目提供国家,城市数据

    动机 简介 个人评分 动机 有时候看一些数据库设计,国家数据会存在一个单独的表里面.这种方式读取数据库无疑又要加上一层join,很不划算. 简介 [django-cities]1可用为你提供国家和城市 ...

  6. 安装aodh

    在控制节点上执行 #!/bin/bash MYSQL_ROOT_PASSWD='m4r!adbOP' GNOCCHI_PASSWD='gnocchi1234!' CEILOMETER_PASSWD=' ...

  7. python多进程单线程+协程实现高并发

    并发:看起来像同时运行就是并发 并行:同一时间同时被执行叫做并行,最大并行数就是CPU核数 协程不是实实在在存在的物理基础和操作系统运行逻辑,只是程序员从代码层面避开了系统对遇到IO的程序会切走CPU ...

  8. SpringBoot整合MyBatis完成用户查询

    接上面工程代码,可以参考:https://www.cnblogs.com/braveym/p/11349409.html 1 .在 mapper 接口中以及映射配置文件中添加相关代码 修改UserMa ...

  9. 使用Docker Maven 插件进行镜像的创建以及上传至私服

    1.在进行服务容器化部署的时候,需要将服务以及其运行的环境整个打包做成一个镜像,打包的过程有两种办法,第一种是首选通过maven打成jar包,然后再编写dockerfile,执行docker buil ...

  10. sql常用到的查询连接

    一.内连接(Inner Join) select * from a inner join b on a.name=b.name; 此语句的结果为同时匹配表a和表b的记录集.即内连接取的是两个表的交集. ...