文档章节

Python基础-面向对象-反射

ZHAO_JH
 ZHAO_JH
发布于 2018/04/18 14:43
字数 1400
阅读 10
收藏 2

反射

指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),具有可插拔机制

hasattr()

用于判断对象是否包含对应的属性

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(hasattr(P,"Name"))                        #属性判断
老虎是猫科动物
True

getattr()

用于返回一个对象默认属性值

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(getattr(P,"Name"))                        #对象返回值
print(getattr(P,"Test","没有这个属性"))         #定义默认值,没有则返回默认值
老虎是猫科动物
True
老虎
没有这个属性

__getattr__()

用于返回一个方法默认属性值,需要用类方法访问

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __getattr__(self, item):                #定义方法默认值,没有则返回默认值
        print("没有【%s】这个方法!!!"%item)
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(getattr(P,"Name"))                        #对象返回值
P.test                                          #调用不存在的方法测试
老虎是猫科动物
老虎
没有【test】这个方法!!!

__getitem__()

用于返回一个方法默认属性值,需要字典方式访问

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __getitem__(self, item):                #定义方法默认值,没有则返回默认值
        print("没有【%s】这个方法!!!"%item)
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(getattr(P,"Name"))                        #对象返回值
P['test']                                       #调用不存在的方法测试
老虎是猫科动物
老虎
没有【test】这个方法!!!

__getattribute__()

用于返回一个方法默认属性值(无论存在不存在)

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __getattribute__(self, item):           #定义方法默认值,没有则返回默认值
        print("无论【%s】有没有都执行!!!"%item)
P = Animal("猫科","老虎")                       #实例化
P.dynamic                                       #调用存在的方法测试
P.test                                          #调用不存在的方法测试
无论【dynamic】有没有都执行!!!
无论【test】有没有都执行!!!

setattr()

用于设置属性值,新增和修改

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(P.__dict__)                               #查看设置前属性字典
setattr(P,"mood","愤怒")                        #设置新增属性值
setattr(P,"Name","狸猫")                        #设置修改属性值
print(P.__dict__)                               #查看设置后属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
{'Species': '猫科', 'Name': '狸猫', 'mood': '愤怒'}

__setattr__()

用于设置属性值,新增和修改,用类属性方式新增和修改才能触发类方法

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __setattr__(self, key, value):          #定义新增修改属性函数
        self.__dict__[key] = value              #底层实现方式,表示修改底层字典

P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(P.__dict__)                               #查看设置前属性字典
P.mood = "愤怒"                                 #设置新增属性值
P.Name = "狸猫"                                 #设置修改属性值
print(P.__dict__)                               #查看设置前属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
{'Species': '猫科', 'Name': '狸猫', 'mood': '愤怒'}

__setitem__()

用于设置属性值,新增和修改。用字典形式新增和修改才能触发类方法

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __setitem__(self, key, value):          #定义新增修改属性函数
        self.__dict__[key] = value              #底层实现方式,表示修改底层字典

P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(P.__dict__)                               #查看设置前属性字典
P['Mood'] = "愤怒"                              #字典形式新增属性值
P['Name'] = "狸猫"                              #字典形式修改属性值
print(P.__dict__)                               #查看设置前属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
{'Species': '猫科', 'Name': '狸猫', 'Mood': '愤怒'}

delattr()

用于用类方法删除属性

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __delattr__(self, item):
        print("删除数据")
        self.__dict__.pop(item)
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(P.__dict__)                               #查看删除前属性字典
del P.Name                                      #删除属性
print(P.__dict__)                               #查看删除后属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
删除数据
{'Species': '猫科'}

__delitem__()

用于以字典形式删除属性

# -*- coding:utf8 -*-
class Animal:                                   #定义类
    def __init__(self,species,name):            #定义属性
        self.Species = species
        self.Name = name
    def dynamic(self):                          #定义方法
        print("%s是%s动物" %(self.Name,self.Species))
    def __delitem__(self, key):                 #定义删除方法
        print("删除数据")
        self.__dict__.pop(key)
P = Animal("猫科","老虎")                       #实例化
P.dynamic()                                     #实例化输出

print(P.__dict__)                               #查看删除前属性字典
del P['Name']                                      #删除属性
print(P.__dict__)                               #查看删除后属性字典
老虎是猫科动物
{'Species': '猫科', 'Name': '老虎'}
删除数据
{'Species': '猫科'}

© 著作权归作者所有

ZHAO_JH
粉丝 17
博文 203
码字总数 182453
作品 0
宝山
运维
私信 提问
PYTHON面向对象章节深入讲解-张明阳-专题视频课程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/83581748 PYTHON面向对象章节深入讲解—73人已学习 课程介绍 介绍了类和面向对象...

安静的技术控
2018/08/24
0
0
python基础---面向对象高级

面向对象高级 isinstance(obj,cls) 检查obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) 输出:True issubclass(sub,super) 检查sub类是否是 supe......

迟到的栋子
2018/07/01
0
0
Python3基础之学习笔记(七)-面向对象

文章目录 1. 面向对象 1. 面向对象 1.1 面向对象介绍 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计),面向对象编程是一种编程方式,此编程方式需要使用 “类” 和 “...

GoldenKitten
01/15
0
0
你想要的Python面试都在这里了【315+道题】

写在前面 近日恰逢学生临近毕业,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的...

p柯西
2018/06/12
84
0
Python基础面试题80问 Python自动化开发

为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java、PHP、C、C#、C++等其他语言的对比? 4. 简述解释型和编译型编程语言? 5. Python解释器种类以及特点? 6. 位和字节的关...

zhouzhou2018
2018/05/24
42
0

没有更多内容

加载失败,请刷新页面

加载更多

数据安全管理:RSA算法,签名验签流程详解

本文源码:GitHub·点这里 || GitEE·点这里 一、RSA算法简介 1、加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用。可以在不直接传递密钥的情况下,完成加解密操...

知了一笑
20分钟前
1
0
Podman 使用指南

> 原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker...

米开朗基杨
今天
6
0
拯救 项目经理个人时间的5个技巧

优秀的项目经理都有一个共同点,那就是良好的时间管理能力。专业的项目经理会确保他们的时间投入富有成效,尽可能避免时间浪费。 时间管理叫做GTD,即Getting Things Done——“把事情做完”...

Airship
今天
7
0
LNMP环境介绍,Mariadb安装,服务管理,mariadb安装3

LNMP环境介绍 Nginx 处理的请求有两种,分为 静态与动态 图片,js,css,视频,音频,flash 等都是静态请求,这些数据都不是保存在数据库里面的 动态请求一般来说,需要的数据是在数据库里面...

doomcat
今天
3
0
前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部