python-魔法属性和反射
python魔法属性和反射
#!/usr/bin/python3
# coding:utf-8
# Auther:AlphaPanda
# Description:与类相关的魔法属性
# Version:1
# Date:Wed Dec 4 02:22:28 EST 2019 class Man():
pass class Woman():
pass class Children(Man,Woman):
"""
成员属性:
skin,hair
成员方法:
eat,drink,__sleep
"""
skin = "黑皮肤"
hair = "黄头发" # 普通无参方法
def eat():
print("小孩会吃糖果")
# 绑定方法:
def drink(self):
print("小孩会吃奶奶")
# 大笑
def laugh(self,func):
print(func)
# 获取函数的名字
print(func.__name__)
print("小孩会大笑")
# 私有方法
def __sleep(self):
print("小孩喜欢睡觉")
# __dict__ 获取对象或类的内部成员结构
obj = Children()
print(obj.__dict__)
print(Children.__dict__) # __doc__ 获取对象或者类的内部文档
print(obj.__doc__)
print(Children.__doc__) # __name__ 获取类名函数名
def ceshi():
print("我是测试函数")
obj.laugh(ceshi) # __class__ 获取当前对象所属的类
cls = obj.__class__
print(cls.hair) # __bases__ 获取一个类直接继承的所有父类,返回元组
tup = Children.__bases__
print(tup) ### 反射 :通过字符串去操作类对象,或者模块中的属性方法
# 类的反射
# 1 hasattr() 检测对象/类中是否有指定成员
# 对象
res = hasattr(obj,"skin") # 属性
print(res)
res = hasattr(obj,"drink") # 方法
print(res) # 类
res = hasattr(Children,"eat")
print(res) # 2 getaddr() 获取对象/类成员的值 # 对象
res = getattr(obj,"hair") # 属性
print(res) res = getattr(obj,"hair123","第三个参数是默认值,如果该成员不存在,默认返回该值")
print(res) # 类:
res = getattr(Children,"drink")
print(res) # 反射对象当中的方法
func1 = getattr(obj,"drink")
print(func1) # 反射的是绑定到对象的方法,对象系统会自动传递
func1() # 反射类当中的方法
func2 = getattr(Children,"drink")
print(func2)
func2(2) """
func = input("请输入您要反射的行数:")
if hasattr(Children,func):
func_new = getattr(Children,func)
func_new()
else:
print("不存在该方法")
"""
# 3 setattr()设置对象/类成员的值
# 对象
setattr(obj,"name","wangwen")
print(obj.name) # 类:
setattr(Children,"wc",lambda : print("小孩会尿尿"))
print(Children.__dict__)
Children.wc() # 4 delattr() 删除对象/类成员的值
# 对象
print(obj.__dict__)
delattr(obj,"name")
print(obj.__dict__) # (2) 模块的反射
"""
包:文件夹
模块:文件
"""
def func1():
print("我是func1方法")
def func2():
print("我是func2方法")
def func3():
print("我是func3方法")
def func4():
print("我是func4方法") # sys.modules 返回一个字典,字典的键是加载的所有模块
import sys
print(sys.modules)
# 获取当前模块得对象,通过这个对象可以进行反射 __main__这个键对应的是本模块对象
mymodule = sys.modules["__main__"]
print(mymodule) # 小案例:通过字符串操作了该模块中相应的方法
while True:
strvar = input("请输入你要反射的方法:")
if hasattr(mymodule,strvar):
func = getattr(mymodule,strvar)
func()
else:
print("没有改函数")
python-魔法属性和反射的更多相关文章
- python魔法属性
1.__doc__:表示类的描述信息 class Person(object): '''定义人的类''' def func(self): pass print(Person.__doc__) 结果为: ...
- python进阶之类常用魔法方法和魔法属性
前言 前面我们总结过了python的关键字.运算符.内置函数.语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法. 魔法属性 对于 ...
- python进阶之函数和类内建魔法属性
前言 关于对象的魔法方法我们已经讲得太多,但是对于类或函数内建的魔法属性和功能我们涉及较少,下面系统了解一下类和函数的内建属性. 查看内建属性 class Person(object): pass d ...
- Python类属性访问的魔法方法
Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- ...
- Python高级笔记(七)魔法属性
1. 私有属性 名字重整 print(Test.__dict__) {'__weakref__': <attribute '__weakref__' of 'Test' objects>, ...
- 『无为则无心』Python面向对象 — 60、魔法属性
目录 1.魔法属性__name__ 2.魔法属性__bases__ 3.魔法属性__mro__ 4.魔法属性__doc__ 5.魔法属性__module__ 和__class__ 6.魔法属性__di ...
- Python魔法 - MetaClass
Python魔法 - MetaClass metaclass The class of a class. Class definitions create a class name, a class ...
- Python魔法方法总结及注意事项
1.何为魔法方法: Python中,一定要区分开函数和方法的含义: 1.函数:类外部定义的,跟类没有直接关系的:形式: def func(*argv): 2.方法:class内部定义的函数(对象的方法 ...
- python魔法方法:__getattr__,__setattr__,__getattribute__
python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...
随机推荐
- 《Google工作法》读书笔记
最近一段时间,拜读了<Google工作法>,工作效率提升10倍的57个技巧. 作者是彼得·费利克斯·格日瓦奇,波兰人. 其中印象最深刻的部分如下: (1)不要被邮件夺走时间 不用邮件,所有 ...
- spring boot-1.简单介绍及环境搭建
1.简介 spring boot 是在spring 基础上进行了全面整合的架构,个人认为优点在于以下几点: 1.简化配置,甚至零配置即可开发出一个web应用.spring boot 默认配置了大量的s ...
- Android 子线程无法刷新UI界面
问题:在Android开发中,子线程无法直接更改UI界面视图的刷新 这个时候 Handler 起到了至关重要的作用. 简单来说 , Handler就是用来传递消息的. Handler可以当成子线程与主 ...
- Comet OJ - Contest #14
Rank38. 还是比较不满意吧,C卡了太久,E没调出来,D也没空去做了. A 签到题. #include<bits/stdc++.h> using namespace std; #def ...
- python_操作MySQL 初解
单文件操作数据库 import random import threading, multiprocessing import time, datetime import pymysql import ...
- luogu P5342 [TJOI2019]甲苯先生的线段树
传送门 你个好好的省选怎么可以出CF原题啊,你们这个题害人不浅啊,这样子出题像极了cxk,说到cxk,我又想起了他是NBA形象大使,跟我是西游文化大使一样一样的,今年下半年... 别说了,jinsai ...
- 在docker下运行mysql
docker pull mysql 从镜像仓库中拉取mysql镜像. 运行镜像 到此mysql在docker容器下运行成功. 使用Navicat连接工具连接到mysql 经过以上步骤就完成了在dock ...
- Coco56公众号关键字索引
目录 1. 本文地址 2. 公众号介绍 3. 关键词及含义 1. 本文地址 博客园:https://www.cnblogs.com/coco56/p/11182421.html 简书:https:// ...
- php 中英文混合字符串长度计算
(strlen($string) + mb_strlen($string,'UTF8')) / 2;tw 这样计算的
- Linux下安装升级python
本文主要是参考帖子,感谢这位博主,我主要是对相关操作进行补充和说明. 本文主要是在linux(centos)下安装Python3.7.1 1.下载安装Python-3.7.1 1) 下载Python- ...