一.类中的方法

普通方法: 没有参数,只能类调用
绑定方法: (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. Ubuntu18.04安装caffe python3.6 opencv3.2 CPU

    设置ubuntu的softwares&updates的源为国内源,这样会提高下载速度. 如果是安装python相关库,为提高速度使用: pip3 install 要下载的库 -i https: ...

  2. 如何创建Maven项目和Spring IOC例子

    把如何创建Maven项目和创建Spring IOC的例子分享给大家,希望能对大家有帮助! 我的博客地址:https://www.cnblogs.com/themysteryofhackers/p/12 ...

  3. Django 生成数据库表时的报错TypeError: __init__() missing 1 required positional argument: 'on_delete'

    原因及解决办法: https://www.cnblogs.com/phyger/p/8035253.html

  4. 攻防世界 misc Exercise 刷题记录

    1.base64stego 1.zip伪加密 2. base64文件隐写,在网上找一个脚本

  5. opencv:截取 ROI 区域

    Rect roi; roi.x = 100; roi.y = 100; roi.width = 250; roi.height = 200; // 截取 ROI 区域 // 这种方式改变 sub,原图 ...

  6. ScheduledThreadPoolExecutor与Timer

    首先来看一下Timer类 例子如下: package cn.concurrent.executor; import java.util.Timer; import java.util.TimerTas ...

  7. 谈谈一些有趣的CSS题目-- 单行居中,两行居左,超过两行省略

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  8. BZOJ - 2038 小Z的袜子(普通莫队)

    题目链接:小Z的袜子 题意:$n$只袜子,$m$个询问,每次回答有多大概率在$[L,R]$区间内抽到两只颜色相同的袜子 思路:普通莫队,如果两个询问左端点在一个块内,则按询问右端点排序,否则按照所在块 ...

  9. Java面向对象封装优化1_this(Python中的self)

    1. 类 package cn.itcast.day06.demo03; /* 问题描述:定义Person的年龄时,无法阻止不合理的数值被设置进来. 解决方案:用private关键字将需要保护的成员变 ...

  10. 创建jsp文件时报错,"javax.servlet.http.HttpServlet" was not found on the Java)

    原因: 创建jsp文件的步骤如下: 出现"javax.servlet.http.HttpServlet" was not found on the Java) 报错信息就是因为没有 ...