python面向对象进阶(1)

面向对象进阶

isinstance(obj,cls) 检查是否obj是类cls的对象
class Foo(object):
pass
obj = Foo()

isinstance(obj,Foo)
issubclass(sub,super) 检查sub是否是super的派生类
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar,Foo)

反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
getattr,setattr,delattr,hasattr


class BlackManger:
feature = 'ugly'
def __init__(self,name,addr):
self.name = name
self.addr = addr
def sell_house(self):
print('%s' %self.name)
def rent_house(self):
print('%s' %self.name)
b1 = BlackManger('somecompany','zgc')

检测是否含有某种属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))

获取属性
n = getattr(b1,'name')
print(n)
func = getattr(b1,'rent_house')
func()


getattr(b1,'aaaaaa')
print(getattr(b1,'aaaaaaa','bucunzai'))


设置属性
setattr(b1,'sb',True)
setattr(b1,'show_name',lambda self:self.name+'sb')
print(b1.__dict__)
print(b1.show_name(b1))

删除属性
delattr(b1,'addr')
delattr(b1,'show_name')
delattr(b1,'show_name111')#不存在,则报错

print(b1.__dict__)

类也是对象
class Foo(object):
staticField = 'old boy'
def __init__(self):
self.name = 'lzq'
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__]

hasattr(this_module,'s1')
hasattr(this_module,'s2')


导入其他模块,利用反射查找该模块是否存在某个方法
# -*- coding:utf-8 -*-

def test():
print('from the test')

# -*- coding:utf-8 -*-
import module_test as obj
#obj.test()
print(hasattr(obj,'test'))

getattr(obj,'test')()

使用反射的好处

class FtpClient:
'未完成'
def __init__(self,addr):
print('正在连接服务器[%s]' %addr)
self.addr = addr
#from module import FtpClient
f1 = FtpClient('192.168.0.0')
if hasattr(f1,'get'):
func_get = getattr(f1,'get')
func_get()
else:
print('不存在此方法')
print('处理其他的逻辑')

__setattr__,__delattr__,__getattr__

class Foo:
x=1
def __init__(self,y):
self.y = y
def __getattr__(self,item):
print('-----> from getattr:"你找的属性不存在')
def __setattr__(self,key,value):
print('----> from setattr')
self.__dict__[key] = value
def __delattr__(self,item):
print('----> from delattr')
self.__dict__.pop(item)

f1 = Foo(10)
print(f1.__dict__)

f1.z = 3

print(f1.__dict__)

f1.__dict__['a']=3
del f1.a
print(f1.__dict__)

f1.xxxxxx

二次加工标准类型(包装)

class List(list):#继承list所有属性,也可以派生出自己新的,比如append和mid
def append(self,p_object):
'派生自己的append:加上类型检查'
if not isinstance(p_object,int):
rasie TypeError('must be int')
super().apppend(p_object)
@property
def mid(self):
'新增自己的属性'
index = len(self)//2
return self[index]
l = List([1,2,3,4])
print(l)
l.append(5)
print(l)
#l.append('11212132') #报错,必须为int类型

print(l.mid)

#其余方法都继承list的
l.insert(0,-1233)
print(l)
l.clear()
print(l)


实现授权的关键点就是覆盖__getattr__方法

import time
class FileHndle:
def __init__(self,filename,mode='r',encoding='utf-8'):
self.file = open(filename,mode,encoding=encoding)
def write(self,line):
t = time.strftime('%Y-%m-%d %T')
self.file.write('%s %s' %(t,line))
def __getattr__(self,item):
return getattr(self.file,item)
f1 = FileHandle('b.txt','w+')
f1.write('hello')
f1.seek(0)
print(f1.read())
f1.close()

#我们来加上b模式支持

import time
class FileHandle:
def __init__(self,filename,mode='r',encoding='utf-8'):
if 'b' in mode:
self.file = open(filename,mode)
else:
self.file = open(filename,mode,encoding = encoding)
self.filename=filename
self.mode = mode
self.encoding = encoding
def write(self,line):
if 'b' in self.mode:
if not isinstance(line,bytes):
raise TypeError('must be bytes')
self.file.write(line)
def __getattr__(self,item):
return getattr(self.file,item)
def __str__(self):
if 'b' in self.mode:
res="<_io.BufferedReader name='%s'>" %self.filename
else:
res="<_io.TextIOWrapper name='%s' mode='%s' encoding='%s'>" %(self.filename,self.mode,self.encoding)
return res

f1=FileHandle('b.txt','wb')
# f1.write('你好啊啊啊啊啊') #自定制的write,不用在进行encode转成二进制去写了,简单,大气
f1.write('你好啊'.encode('utf-8'))
print(f1)
f1.close()

 

作业:
基于授权定制自己的列表类型,要求定制的自己的__init__方法,
定制自己的append:只能向列表加入字符串类型的值
定制显示列表中间那个值的属性(提示:property)
其余方法都使用list默认的(提示:__getattr__加反射)

class List:
def __init__(self,seg):
self.seq = seq
def append(self,p_object):
'派生加上类型检查'
if not isinstance(p_object,str):
raise TypeError('must be str')
self.seq.append(p_object)

@property
def mid(self):
'新增方法'
index = len(self.seq)//2
return self.seq[index]
def __getattr__(self,item):
return getattr(self.seq,item)
def __str__(self):
return str(self.seq)
l = List(['1','2','3'])
print(l)
l.append(4)
print(l)

 

转载于:https://www.cnblogs.com/lzq1987/p/6758575.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常&#xff0c;可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题&#xff0c;下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式&#xff0c;程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受&#xff0c;从提高幅度上来讲&#xff0c;而不是重要性上来讲一、自锁起码提高你50%的速度&#xff0c;我不用自锁和别人一起走AVS25就很辛苦了&#xff0c;用了自锁&#xff0…

ansys matlab 调用,matlab 调用ansys (转载)

问题的提出&#xff1a;我们经常会需要用ansys计算一些东西&#xff0c;之后再用matlab来处理计算的结果。当修改某些参数重复上述过程的时候&#xff0c;就比较容易出现问题——比如ansys模型中的参数和matlab程序中参数的一致性问题等。这时可以考虑采用下面的协同工作的方法…

本地存储之sessionStorage

源码可以到GitHub上下载&#xff01; sessionStorage&#xff1a; 关闭浏览器再打开将不保存数据 复制标签页会连同sessionStorage数据一同复制 复制链接地址打开网页不会复制seessionStorage内的数据 清除缓存加载当前页对页面无影响 1) 同源策略限制。若想在不同页面之间对同…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…

zemax光学设计超级学习手册_穿越十年的一个ZEMAX光学设计案例

目前超过两千人的光学与光学设计方面的微信公众号&#xff0c;欢迎您&#xff01;穿越十年的一个ZEMAX光学设计案例作者&#xff1a;窗台小绿萝CAD&#xff0c;这个词已经深入到学习、工作很多年&#xff0c;翻译过来就是Computer Aided Design&#xff0c;计算机辅助设计。随着…

Java本质和性能

最初的问题是如何计算二进制数中1的个数&#xff1f; 我包含了使用Integer.bitCount&#xff08;&#xff09;的性能比较&#xff0c;该性能可以转换为固有特性&#xff0c;即单个机器代码指令POPCNT和执行相同功能的Java代码。 题 如何计算二进制数中1的个数&#xff1f; 假…

spring RequestMapping 包含http的部分以及各部分详解

RequestMapping有四个参数&#xff0c;分别为&#xff1a;1、value&#xff1a;表示请求URL2、method&#xff1a;表示请求方法3、params&#xff1a;表示请求参数4、headers&#xff1a;表示请求头 【例如】&#xff1a;RequestMapping(value"/testRequestMapping",…

【ZBH选讲·拍照】

【问题描述】 假设这是一个二次元。LYK召集了n个小伙伴一起来拍照。他们分别有自己的身高Hi和宽度Wi。为了放下这个照片并且每个小伙伴都完整的露出来&#xff0c;必须需要一个宽度为ΣWi&#xff0c;长度为max{Hi}的相框。&#xff08;因为不能叠罗汉&#xff09;。LYK为了节省…

php基础是什么,php基础学什么?

有不少同学想要学习 PHP&#xff0c;但又不清楚 PHP 基础学什么&#xff0c;那么这篇文章告诉你。熟悉前端开发语言学习 PHP 之前&#xff0c;首先要学习前端语言包括 HTML、CSS、JS 等。等对前端语言有个大致掌握后&#xff0c;能编写一个 web 静态页面。学习 PHP 基本语法和函…

名为 cursor_jinserted 的游标不存在_生鲜电商存在的问题及对策解析:未来生鲜电商如何发展?...

生鲜电商的特点有哪些&#xff1f;生鲜电商特点&#xff1a;1,生鲜电商具有粘性高、重复购买率高、毛利高的“三高”特性&#xff1b;2,生鲜食品需要保鲜、冷藏、冷冻&#xff1b;3,生鲜食品保质期比较短&#xff1b;保存不易、对物流配送的条件要求极高&#xff1b;4,生鲜商品…

遇到短信轰炸,别人换ip调你的短信接口怎么办

前端开发者很容易暴露自己的请求地址和参数&#xff0c;我们都知道&#xff0c;一个h5页面&#xff0c;按 F12 是可以看到页面的源码的&#xff0c;所以经常很多人会利用这一点恶意调取别人的接口。 我们公司出现了好多次短信接口被大量调用&#xff0c;导致一天发了几万条短信…

UVa 10170 - The Hotel with Infinite Rooms

题目&#xff1a;求从s開始的递增序列&#xff08;每次加1&#xff09;。求出他们加和不小于D的那个最后的加数。 分析&#xff1a;数学题。分治。s s1 ... n n*&#xff08;n1&#xff09;/2 - s*&#xff08;s-1&#xff09;/2 &#xff08;ns&#xff09;*&#xff08;…

番石榴函数和Java 8 Lambdas

我最近阅读了Brian Goetz的《 Lambda的状况》 &#xff0c;在阅读了该文章之后&#xff0c;我想尝试使用Java 8 Lambda表达式。 Brian在他的文章中继续描述了将一种方法称为“功能”接口的接口。 功能接口几乎总是用作匿名类&#xff0c;其中ActionListener是规范示例。 这些“…

linux rsync删文件速度,为什么用rsync删除大量文件的时候比用rm快

为什么用rsync删除大量文件的时候比用rm快今天研究怎么在Linux下快速删除大量文件&#xff0c;搜到很多人都说可以用rsync来删除大量文件&#xff0c;速度比rm要快很多&#xff0c;但是没有人说为什么&#xff0c;仔细研究了一下原因&#xff0c;总结起来大概就是&#xff0c;一…

关于源码,反码,补码(正数--负数)---------(-128)自己的理解

以一个字节为例 1、无符号位&#xff0c;一个字节可以存放0~255共256个数字&#xff1b;有符号位存放-128~127共256个数字&#xff1b; 2、无符号全都表示为正数&#xff1b;有符号位则首位表示正负数&#xff0c;正数首位为0&#xff0c;负数首位为1&#xff08;因此在判断一个…

英特尔x722网卡驱动_产品详情 | 从核心到边缘,英特尔加速5G网络基础设施建设...

英特尔近期宣布推出无可比拟的5G基础设施芯片产品组合&#xff0c;包括一款面向无线基站的10纳米片上系统(SoC)英特尔凌动P5900&#xff0c;和一款面向5G网络处理的结构化ASIC&#xff0c;一款针对5G网络优化、提供基于GPS的高精度网络服务同步功能的以太网适配器。此外&#x…

canvas离屏技术与放大镜实现

教程所示图片使用的是 github 仓库图片&#xff0c;网速过慢的朋友请移步>>> &#xff08;原文&#xff09;canvas 离屏技术与放大镜实现。 更多讨论或者错误提交&#xff0c;也请移步。 利用canvas除了可以实现滤镜&#xff0c;还可以利用离屏技术放大镜功能。为了方…

虚拟机下安装ubuntu后root密码设置

问题描述&#xff1a; 在虚拟机下安装了ubuntu中要输入用户名&#xff0c;一般情况下大家都会输入一个自己的网名或绰号之类的&#xff0c;密码也在这时设置过了。 但是当安装成功之后&#xff0c;使用命令#su root&#xff0c;然后输入刚才设置的密码&#xff0c;发现密码错误…

使用Ajax的Spring MVC REST调用

这篇文章提供了对Spring MVC Web应用程序的REST调用的简单示例。 它基于在Spring MVC上下文示例中使用Spring MVC服务静态资源和使用Ajax获取JSON 。 该代码可在GitHub的Spring-REST-With-Ajax目录中找到。 主页 我们的主页包含与执行Ajax调用的Javascript函数链接的四个按钮…