一.类中的方法

普通方法: 没有参数,只能类调用
绑定方法: (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 基础之面向对象之类中的方法和与类相关的魔术属性以及反射的更多相关文章

  1. Python之路【第六篇】python基础 之面向对象(一)

    一.三大编程范式 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 2.从上述的指令中提取重复的代码块或逻辑,组织到一起(比 ...

  2. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  3. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  4. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  5. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  6. Python基础------列表,元组的调用方法

    Python基础------列表,元组的调用方法@@@ 一. 列表 Python中的列表和歌曲列表类似,也是由一系列的按特定顺序排列的元素组成的,在内容上,可以将整数,实数,字符串,列表,元组等任何类 ...

  7. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  8. 《python基础教程(第二版)》学习笔记 类和对象(第7章)

    <python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person:    def setName(self,name):        self.name=n ...

  9. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

随机推荐

  1. Git的基本使用 -- 历史版本、版本回退

    查看提交的日志(历史版本) git log 不能查看已删除的commit记录 git reflog 可以查看所有分支的所有操作记录,包括已删除的commit记录 版本回退 git reset --ha ...

  2. bugku 输入密码查看flag

    首先进入网页会看到一个网页 然后用bp进行爆破 首先点击clear 然后选中刚下随便输入进去的密码点击add然后设置一下类型 然后进行开始攻击 攻击过程中点击length 根据长度可以判断出密码然后回 ...

  3. ACM的探索之Keen On Evrything But Triangle(我觉得可以很接近啦!!)

    #include<bits/stdc++.h> using namespace std; int main() { int n,q,l,r; while(cin>>n>& ...

  4. Django框架之ORM的相关操作(二)

    模型类: class Commongity(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max ...

  5. 「CSP-S模拟赛」2019第一场

    目录 T1 小奇取石子 题目 考场思路 正解 T2 「CCO 2017」专业网络 题目 考场思路 题解 T3 「ZJOI2017」线段树 题目 考场思路 正解 这场考试感觉很奇怪. \(T1.T2\) ...

  6. Python3 post 嵌套json

    目录 python3 post json burpsuite 抓取 python requests 数据包 小结 python3 post json 前些天python3 post出现的小问题做下记录 ...

  7. js 一句代码 让网页变为编辑器

    document.body.contentEditable = true 只要在控制台执行这行语句   页面就可以自由输入编辑了

  8. [JavaScript] 两个数相除有余数时结果加1

    实现代码 ; ; ?(total/item):(Math.floor(total/item)+); console.log(page)

  9. Numpy Pandas

    数据分析 : 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律. 数据分析三剑客 -  Numpy Pandas Matplotlib # Numpy 基于一维或多维的数 ...

  10. SpringCloud全家桶学习之客户端负载均衡及自定义负载均衡算法----Ribbon(三)

    一.Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端  负载均衡的工具(这里区别于nginx的负载均衡).简单来说,Ribbon是Netf ...