Python 基础之面向对象之类中的方法和与类相关的魔术属性以及反射
一.类中的方法
普通方法: 没有参数,只能类调用
绑定方法: (1)绑定到对象(自动传递对象参数) (2)绑定到类(自动传递参数)
静态方法: 无论是类还是对象,都能调用的方法
#例:
class Dog():
def __init__(self,name):
self.name = name
#普通方法
def jiao():
print("小狗会叫")
#绑定到对象方法
def tian(self):
print("小狗喜欢舔骨头")
#绑定到类方法
@classmethod
def chi(cls):
print(cls)
print("小狗喜欢吃肉")
#静态方法
@staticmethod
def jump():
print("小狗喜欢跳起来接飞盘")
#实例化对象
obj = Dog("小黑")
# (1)普通方法
Dog.jiao()
#对象无法调用,只能用类.方法
# (2)绑定到对象方法
obj.tian()
#Dog.tian(123) #如果硬要使用类来调用,满足实参一一对应(随机加个值)
# (3)绑定到对象方法
Dog.chi()
# 用对象调用绑定到类的方法是可以的
# 先找出该对象所归属的类是谁,然后再传递这个类
obj.chi()
# (4)静态方法
obj.jump()
Dog.jump()
二.与类相关的魔术属性
#例:
class Human():
pass
class Man():
pass
class Woman():
pass
class Children(Man, Woman):
'''
类的功能: 描述一个小孩
类的成员属性: eye
类的成员方法: sleep __beat_doudou
'''
eye = "蓝色的眼睛"
#普通方法
def eat():
print("小孩需要多吃有营养的东西")
#绑定方法
def sleep(self):
print("小孩喜欢睡觉")
def drink(self):
print("小孩要经常喝水")
def cry(self, func):
res = func.__name__
print(res, type(res))
#私有绑定方法
def __beat_doudou(self):
print("小孩喜欢打豆豆")
#__dict__ 获取对象或类的内部成员结构
obj = Children()
res = obj.__dict__
# __dict__ 归属是类的.所有用对象是没有办法查看类的内部成员结构的
print(res) #所以res为空
print(Children.__dict__)
# __doc__ 获取对象或类的内部文档
res = Children.__doc__
print(res)
'''
输出结果:
类的功能: 描述一个小孩
类的成员属性: eye
类的成员方法: sleep __beat_doudou
'''
# __name__ 获取类名函数名
def myfunc():
print("我是函数")
obj.cry(myfunc) # myfunc <class 'str'>
# __class__ 获取当前对象所属的类
res = obj.__class__
print(res) #<class '__main__.Children'>
# __bases__ 获取一个类直接继承的所有父类,返回元组
res = Children.__bases__
print(res)
三.反射
概念:通过字符串去操作类对象 或者 模块中的属性方法
(1)类中的反射
hasattr() 检测对象/类是否有指定的成员
getattr() 获取对象/类成员的值
setattr() 设置对象/类成员的值
delattr() 删除对象/类成员的值
(2)模块的反射
sys.modules 返回一个系统字典,字典的键是加载的所有模块
1.类中的反射
# (1)hasattr() 检测对象/类是否有指定的成员 [以是否能够自动调用为基准]
#用的是二中的obj
res = hasattr(obj, "eye")
print(res)
res = hasattr(Children, "eat")
print(res) # 返回True说明存在
# (2)getattr() 获取对象/类成员的值
res = getattr(obj, "eye")
print(res) # 蓝色的眼睛
res = getattr(obj, "sleep")
print(res) # 它返回的是一个绑定方法
res() # 小孩喜欢睡觉
# 类的方式
res = getattr(Children, "eat")
print(res)
res() # 小孩需要多吃有营养的东西
res = getattr(Children, "sleep")
print(res) # 它不是一个绑定方法,所有一定需要用类的方式
res(1)
#(3)getattr 第三个参数可选如果获取不到这个值,可以添加默认提示,预防报错
res = getattr(obj, "abc", "对不起这个真没有")
print(res)
# strvar = input("请输入您要调用的函数:")
# if hasattr(obj,strvar):
# res = getattr(obj,strvar)
# res()
# (3)setattr() 设置对象/类成员的值
setattr(obj, "hair", "黑色")
print(obj.hair)
setattr(Children, "skin", "绿色")
print(Children.skin)
# (4)delattr() 删除对象/类成员的值
delattr(obj, "hair")
# print(obj.hair)
delattr(Children, "skin")
# print(Children.skin)
2.模块的反射
#sys.modules 返回一个系统字典,字典的键是加载的所有模块
#例3:
import sys
res = sys.modules
print(res)
print(__name__) # __main__ 是否是主文件运行
mymodule = sys.modules[__name__]
print(mymodule) #打印主模块
def func1():
print("这是func1方法")
def func2():
print("这是func2方法")
def func3():
print("这是func3方法")
# 用户给我字符串,我反射对应的方法调用
while True:
strvar = input("请输入您要调用的方法:")
if hasattr(mymodule, strvar):
_func_ = getattr(mymodule, strvar)
_func_()
# 注意这个函数会继承您输入的函数,
# 所有如果输入_myfunc会打印上一个函数的内容,所有这个函数名取得特殊一点
else:
print("大哥,没有")
Python 基础之面向对象之类中的方法和与类相关的魔术属性以及反射的更多相关文章
- Python之路【第六篇】python基础 之面向对象(一)
一.三大编程范式 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 二十. Python基础(20)--面向对象的基础
二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...
- python基础,函数,面向对象,模块练习
---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? # [] {} () None 0 2,位和字节的关系? # ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- Python基础------列表,元组的调用方法
Python基础------列表,元组的调用方法@@@ 一. 列表 Python中的列表和歌曲列表类似,也是由一系列的按特定顺序排列的元素组成的,在内容上,可以将整数,实数,字符串,列表,元组等任何类 ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 《python基础教程(第二版)》学习笔记 类和对象(第7章)
<python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person: def setName(self,name): self.name=n ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
随机推荐
- python正则非贪婪模式
上一篇python正则匹配次数大家应该也发现了,除了?其他匹配次数规则都是尽可能多的匹配 那如果只想匹配1次怎么办呢,这就是正则中非贪婪模式的概念了 原理就是利用?与其他匹配次数规则进行组合 单个匹配 ...
- drf框架,restful接口规范,源码分析
复习 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} ...
- 线段树 区间查询最大值,单体修改 hdu 1754
#include<cstdio> #include<algorithm> #include<string.h> #include<math.h> #in ...
- 关于mybatis中多参数传值
如果前台单独传递多个参数,并且未进行封装,在mybatis的sql映射文件中需要以下标的形式表示传递的参数,从0开始 即:where name=#{0} and password =#{1}:0表示第 ...
- python基础 pyc
关于pyc的几点记录: python运行时会将python语句----->"字节码"------>转发到"虚拟机" 字节码:在大型的python程序 ...
- pwnable.kr-random-Writeup
MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- HTML-based script和URL-based script使用规则
选择哪种模式应该根据实际需要来进行,下面是一些常见的参考原则: 1.基于浏览器的应用程序推荐使用HTML-based script 2.不是基于浏览器的应用程序推荐使用URL-based scrip ...
- 编译原理--05 用C++手撕PL/0
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...
- JS高级---体会面向对象和面向过程的编程思想
体会面向对象和面向过程的编程思想 ChangeStyle是自定义的构造函数,再通过原型添加方法的函数. 实例化对象,导入json参数,和创建cs,调用原型添加的方法函数 过渡,先熟悉记忆 <!D ...
- 2、介绍在TensorFlow当中使用不同的方式创建张量tensor
import tensorflow as tf from tensorflow.python.framework import ops ops.reset_default_graph() #开始一个计 ...