Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)
一 isinstance(obj,cls)和issubclass(sub,super)
isinstance(obj,cls)检查是否obj是否是类 cls 的对象
class Foo(object):
pass
obj = Foo() print(isinstance(obj, Foo))
issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo(object):
pass class Bar(Foo):
pass print(issubclass(Bar, Foo))
>>True
二、反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个实现反射的函数:
hasattr(object,name:判断object中有没有一个name字符串对应的方法或属性
getattr(object, name, default=None):获取属性
setattr(x, 'y', v) :设置属性,is equivalent to ``x.y = v''
delattr(x, 'y') :删除属性,is equivalent to ``del x.y''
四个方法使用的演示:
class BlackMedium:
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=BlackMedium('万成置地','回龙观天露园') #检测是否含有某属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house')) #获取属性
n=getattr(b1,'name')
print(n)
func=getattr(b1,'rent_house')
func() # getattr(b1,'aaaaaaaa') #报错
print(getattr(b1,'aaaaaaaa','不存在啊')) #设置属性
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__) 四个方法的使用演示
三、__str__
__str__:定义在类内部的内置的绑定方法,打印的会自动将对象传入
class Teacher:
def __init__(self,name,age):
self.name=name
self.age=age
self.courses=[] def teach(self):
print('%s teach' %self.name) def __str__(self):
return '<name:%s age:%s>' %(self.name,self.age) class Course:
def __init__(self,name,price,period):
self.name=name
self.price=price
self.period=period
def __str__(self):
return '《name:%s price:%s period:%s》' %(self.name,self.price,self.period) egon=Teacher('egon',18)
print(egon) #egon.__str__()
>>:
<name:egon age:18> python=Course('python',20000,'6mon')
openstack=Course('openstack',10,'3mon')
linux=Course('linux',1,'1mon') egon.courses.append(python)
egon.courses.append(openstack)
egon.courses.append(linux) # egon.courses.extend([python,openstack,linux])
print(egon.courses)
for obj in egon.courses:
print(obj)
>>:
[<__main__.Course object at 0x0000027F4FF70748>, <__main__.Course object at 0x0000027F4FF70780>, <__main__.Course object at 0x0000027F4FF70710>]
《name:python price:20000 period:6mon》
《name:openstack price:10 period:3mon》
《name:linux price:1 period:1mon》
四、__del__
析构方法,当对象在内存中被释放时,自动触发执行。
import time
class Foo:
def __init__(self,x):
self.x=x
print('connect mysql') #conn=abcdef('192.168.1.10',3306) def __del__(self):
'''做一些与这个对象有关的清理操作'''
# conn.close()
# file.close()
print('====>') f=Foo(10)
del f #f.__del__()
time.sleep(3)
print('主程序')
>>:
connect mysql
====>
主程序 f=Foo(10)
time.sleep(3)
print('主程序')
>>:
connect mysql
主程序
====>
五、__item__系列
class Foo:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def __getitem__(self, item):
# print(self,item,type(item))
# return getattr(self,item)
return self.__dict__[item]
def __setitem__(self, key, value):
# setattr(self,key,value)
self.__dict__[key]=value def __delitem__(self, key):
# delattr(self,key)
self.__dict__.pop(key) def __len__(self):
return 10
f=Foo('egon',18,'male')
print(f.name) #f['name']
print(f.age) #f['age']
print(f.sex) #f['sex'] print(f['name']) f['name']='egon_nb'
print(f.__dict__)
del f['name']
print(f.__dict__)
print(len(f))
>>:
egon
18
male
egon
{'name': 'egon_nb', 'age': 18, 'sex': 'male'}
{'age': 18, 'sex': 'male'}
10
Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)的更多相关文章
- Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)
上节课复习:1.编程思想 面向过程 核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...
- python基础——18(面向对象2+异常处理)
一.组合 自定义类的对象作为另一个类的属性. class Teacher: def __init__(self,name,age): self.name = name self.age = age t ...
- 十八. Python基础(18)常用模块
十八. Python基础(18)常用模块 1 ● 常用模块及其用途 collections模块: 一些扩展的数据类型→Counter, deque, defaultdict, namedtuple, ...
- Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)
一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...
- python基础教程_学习笔记9:抽象
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/30745465 抽象 懒惰即美德. 抽象和结构 抽 ...
- Python基础(17)_面向对象程序设计(抽象类、继承原理、封装、多态,绑定方法)
一.抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化 1.在python中实现抽象类 import abc #利用abc模块实现抽象类 class All_file(metacl ...
- python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射
多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...
- python基础教程_学习笔记18:标准库:一些最爱——shelve
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36029981 标准库:一些最爱 shelve S ...
- python基础整理4——面向对象装饰器惰性器及高级模块
面向对象编程 面向过程:根据业务逻辑从上到下写代码 面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程 面向对象编程(Object Oriented Pro ...
随机推荐
- c++ 请抛弃匈牙利命名法 - 变量命名代码风格的建议。
我只针对c++码农们讲,其他语言不了解不过应该大同小异.曾几何时翻开21天学通c++系列等脑残入门书,都以匈牙利命名法示人(DWORD dwXXX, int nXXX, string strXXX). ...
- srping mvc学习
HOME 控制器 package ghy.webapp.myapp; import java.text.DateFormat; import java.util.Date; import java.u ...
- MySQL 5.6修改data目录
默认数据存放位置: C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.6\ 打开该位置,即可看见my. ...
- django 类通用视图详解
view() : 该类为所有类视图的父类,处于最底层,仅仅只对请求参数做校验后,给特定请求方法做特定调用. 用法: url中定位到类方法:Aa.as_view() ——> View.as ...
- Easyui Form增加myLoad方法,使其支持二级数据对象
$.extend($.fn.form.methods, { myLoad : function (jq, param) { return jq.each(function () { load(this ...
- android JNI常用添加log方法
android JNI 打log方法 添加库支持 LOCAL_LDLIBS :=-llog -landroid 包含头文件 #include <android/log.h> #define ...
- array_sum的用法
众所周知,PHP中函数是功能很强大的,那么今天就说下array_sum的功能吧. 函数功能:返回数组中所有值的和. 举例: <?php $a = array(1,2); $b = array_s ...
- linux下shell程序(一)
shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步:创建一个包含命令和控制结构的文件. 第二步:修改这个文件的权限使它可以执行.使用c ...
- poj2528
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 56864 Accepted: 16445 ...
- Exponentiation(高精度大数)
Exponentiation Description Problems involving the computation of exact values of very large magnitud ...