iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python3--面向对象的进阶
  • 705
分享到

python3--面向对象的进阶

进阶面向对象 2023-01-30 21:01:47 705人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

昨日内容练习class A:     def func1(self):pass  # func1 普通方法   &nbs

昨日内容练习

class A:
    def func1(self):pass  # func1 普通方法
    @claSSMethod
    def func2(self):pass  # func2 类方法
    @staticmethod
    def func3(self):pass  # func3 静态方法

# func1 普通方法 对象和类绑定的过程
a = A()
b = A()
print(A.func1)  # 3个地址都不一样
print(a.func1)
print(b.func1)

# func2 类方法 由于不适用对象内存空间中的属性,
# 所以不会将对象和方法绑在一起,而是将类和方法绑在一起
print(A.func2)
print(a.func2)  # 对象能找到类,类里面绑着方法
print(b.func2)

# func3 静态方法 不是绑定方法 没有和对象或者类发生任何绑定关系
print(A.func3)
print(a.func3)
print(b.func3)

执行结果

1 普通方法,func1结果


<bound method A.func1 of

<bound method A.func1 of


2 类方法,func2结果

<bound method A.func2 of

<bound method A.func2 of

<bound method A.func2 of


3 静态方法,func3结果





isinstance(对象名,类名) 返回True,False

isinstance(obj,cls)检查obj是否是类cls的对象

例子

class A:pass
class B(A):pass
b = B()
print(isinstance(b, A))  # 能够检测到继承关系
print(isinstance(b, B))
print(type(b) is A)
print(type(b) is B)  # type只单纯的判断类

执行结果

True

True

False

True


issubclass(子类名,父类名) 返回True,False

issubclass(sub,super)检查sub类是否是super类的派生类

例子,单继承

class A:pass
class B:pass
class C(B):pass
class D(C):pass
print(issubclass(C,B))  # 判断C是不是B的子类
print(issubclass(D,C))  # 判断D是不是C的子类
print(issubclass(D,B))  # 判断D是不是C的子类
print(issubclass(D,A))  # 判断D是不是A的子类

执行结果

True

True

True

False


例子2,多继承

class A:pass
class B:pass
class C(A,B):pass
class D(C):pass

print(issubclass(C,A))  # 判断C是不是A的子类
print(issubclass(C,B))  # 判断C是不是B的子类
print(issubclass(D,B))  # 判断D是不是B的子类
print(issubclass(D,A))  # 判断D是不是A的子类

执行结果

True

True

True

True


面向对象进阶(反射,非常重要的知识点*******7星)

1 什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力(自省),它首先被程序语言的设计领域所采用,并在Lisp和面向对象取得了成绩


2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。Python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)


反射

正常情况下如果可以拿到这个变量, 那么如有这个变量的字符串形式,就是用反射可以获取到这个值

使用字符串数据类型的变量名 访问一个命名空间中的名字

找一个属性,直接就可以找到这个属性的值

找一个方法,找到的是这个方法的内存地址


getattr 使用字符串数据类型的变量名 访问一个命名空间中的名字

源代码

def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value
    
    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass


例子

class A:
    role = 'person'  # 静态属性
    def func(self):
        print('*'*10)
print(A.__dict__['role'])  # 查看静态属性的值
ret = input('>>>')  # 用户输入role
print(A.__dict__[ret])  # 实际上就是执行了最上面的print

执行结果

person

>>>role

person


那么如何让用户输入func然后去执行类里面的方法func呢?

class A:
    role = 'person'  # 静态属性
    def func(self):
        print('*'*10)
ret = input('>>>')  # 用户输入func
# 这里要用到字符串拼接+eval函数才能实现
s = 'A'
ss = s + '.' + ret
eval(ss)(1)

执行结果

>>>func

**********


这样很麻烦,也不安全,还有什么方法呢?

getattr()  从命名空间中获取这个名字对应的值

class A:
    role = 'person'  # 静态属性
    def func(self):
        print('*'*10)

# 从A的命名空间里找一个属性,直接就可以找到这个属性的值
# 通俗点就是需要获取谁(func),就是getattr(A,'func') getattr(类,'属性名')
print(getattr(A, 'role'))

a = A()  # 实例化一个对象a
# 从A的命名空间里面找一个方法,找到的是这个方法的内存地址,如果要执行这个方法,在后面加()
print(getattr(a, 'func'))
getattr(a, 'func')()

#getattr如何让用户输入一个类中的方法名,并执行
ret = input('>>>:')
getattr(a, ret)()  # getattr(a, ret)实际上获取的就是func方法的内存地址,后面加()就表示执行

执行结果

person

<bound method A.func of

**********

>>>:func

**********


例2

class A:
    role = 'Person'
    def __init__(self):
        self.money = 500
    def func(self):
        print('*'*10)
a = A()
print(a.func)  # 打印a.func的内存地址
getattr(a, 'func')()  # 使用getattr获取名字对应的值,名字加()就表示执行这个方法
print(getattr(a, 'money'))  # 使用getattr获取名字对应的值

执行结果

<bound method A.func of

**********

500



hasattr() 判断一个命名空间中有没有这个名字

源码

def hasattr(*args, **kwargs): # real signature unknown
    """
    Return whether the object has an attribute with the given name.
    
    This is done by calling getattr(obj, name) and catching AttributeError.
    """
    pass


例1

class A:
    role = 'person'
    def func(self):
        print('py3study.com')

a = A()
print(hasattr(a, 'r'))  # 也可以写成 print(hasattr(A, 'r'))
print(hasattr(a, 'role'))
print(hasattr(a, 'func'))

执行结果

False

True

True


hasattr()经常与getattr()一起用,首先判断一个命名空间中有没有这个名字,有的话就用getattr获取这个名字对应的值

示例

class A:
    role = 'person'
    def func(self):
        print('py3study.com')

ret = input('>>>')
if hasattr(A, ret):  # 判断是否存在
    print(getattr(A, ret))  # 如果存在则打印内存地址
if hasattr(A, ret):
    func = getattr(A, ret)  # 如果存在则执行这个方法
    func(1)
else:
    print('error')  # 不存在则报错

执行结果

>>>func


py3study.com


类使用类命名空间中的名字

对象使用对象能用的方法和属性

模块使用模块中的名字

导入os模块,利用getattr获取os模块中'rename'对应的值,os.rename('old','new')执行改文件名的操作

import os;getattr(os, 'rename')('user', 'user_info') 


导入time模块,利用getattr获取time模块中'time'对应的值,print(time.time())打印时间戳

import time;print(getattr(time, 'time')())


从自己所在的模块中使用自己名字

示例

def login():
    print('执行login功能')

def  reGISter():
    print('执行register功能')

import sys
print(sys.modules['__main__'])  # 打印当前文件的路径,一个.py文件就相当于一个模块
func = input('>>>')
if hasattr(sys.modules['__main__'], func):  # 判断当前模块中的命名空间,是否有用户输入的这个名字
    getattr(sys.modules['__main__'], func)()  # 存在的话执行用户输入的名字加()这个函数

执行结果

>>>login

执行login功能


类使用类命名空间中的名字

getattr(类名,'名字')

对象使用对象能用的方法和属性

getattr(对象名,'名字')

模块使用模块中的名字

导入模块

getattr(模块名,'名字')

从自己所在的模块中使用自己名字

import sys

getattr(sys.modules['__main__'],名字)

getattr一定要和hasattr配合使用


反射 :4个内置函数

getattr  # 从命名空间中获取这个名字对应的值

hasattr  # 判断一个命名空间中有没有这个名字  

setattr  # 修改和新建

delattr  # 删除一个属性


setattr,delattr

setattr源码

def setattr(x, y, v): # real signature unknown; restored from __doc__
    """
    Sets the named attribute on the given object to the specified value.
    
    setattr(x, 'y', v) is equivalent to ``x.y = v''
    """
    pass

delattr源码

def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.
    
    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass



增删改 对象属性

class A:
    def __init__(self, name):
        self.name = name

    def wahaha(self):
        print('噢噢噢噢哦哦哦')
a = A('Sam')
print(a.name)
a.wahaha()
print(a.__dict__)

# 使用setattr: 无则增加有则修改的原则
setattr(a, 'age', 18)  # 给a对象新增一个属性
print(a.__dict__)
a.wahaha()  # 执行wahaha()方法

# 使用setattr: 无则增加有则修改的原则
setattr(a, 'name', 'Jack')  # 修改a对象的name属性为Jack
print(a.__dict__)

del a.name  # 删除a对象的name属性
print(a.__dict__)

# 使用delattr删除
delattr(a, 'age')
print(a.__dict__)

执行结果

Sam

噢噢噢噢哦哦哦

{'name': 'Sam'}

{'name': 'Sam', 'age': 18}

噢噢噢噢哦哦哦

{'name': 'Jack', 'age': 18}

{'age': 18}

{}


例2

class A:
    def __init__(self, name):
        self.name = name

    def  wahaha(self):
        print('aaaaaaaaaaa')

def qqxing(self):
    print('qqqqqqqqq')

a = A('Tom')
setattr(a, 'qqxing', qqxing)  # setattr把函数qqxing 加到类里面去了
a.qqxing(a)

# 使用getattr函数从命名空间中获取这个名字对应的值
getattr(a, 'qqxing')(a)

执行结果

qqqqqqqqq

qqqqqqqqq


--结束END--

本文标题: python3--面向对象的进阶

本文链接: https://www.lsjlt.com/news/179044.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python3--面向对象的进阶
    昨日内容练习class A:     def func1(self):pass  # func1 普通方法   &nbs...
    99+
    2023-01-30
    进阶 面向对象
  • 面向对象进阶
    isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstance...
    99+
    2023-01-31
    进阶 面向对象
  • python3--面向对象进阶之内置方法
    __str__和__repr__改变对象的字符串显示__str__, __repr__示例class List:     def __init__(self, *args...
    99+
    2023-01-30
    进阶 面向对象 方法
  • Python26 面向对象进阶
    静态方法 一个简单的面向对象写法: class Dog(object): def __init__(self,name): self.name = name def eat(self,food): ...
    99+
    2023-01-31
    进阶 面向对象
  • Python 面向对象进阶
     sys模块 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import sys 4 ''' 5 sys.argv : 在命令行参数是一个空列表,在其他中第一个列表元...
    99+
    2023-01-30
    进阶 面向对象 Python
  • python 面向对象(进阶篇)
    上一篇《Python 面向对象(初级篇)》文章介绍了面向对象基本知识:面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中)对象,根据模板...
    99+
    2023-01-31
    面向对象 进阶篇 python
  • Python3 面向对象
    Python3 面向对象 python是一门面向对象语言,在python中有一句话:一切都是对象 面向对象简介 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 ...
    99+
    2023-01-31
    面向对象
  • [Python3]Python面向对象
    一、面向对象的程序设计的由来 1.第一阶段:面向机器,1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据。 简单来说,就是直接编写 0 和 1 的序列来代表程序语言。例如:使用 ...
    99+
    2023-01-31
    面向对象 Python
  • Python面向对象编程之类的进阶
    目录1、引用的概念2、对象的拷贝2.1 实例方法的引用2.2 类的特性装饰器3、类的名称修饰3.1 _单下划线开头的名称修饰3.2 _单下划线结尾的名称修饰3.3 __双下划线开头的...
    99+
    2024-04-02
  • Python面向对象进阶及类成员
    再次了解多继承先来一段代码#!/usr/bin/env python# _*_ coding:utf-8 _*_class A:    def bar(self):        print("BAR")        self.f1()c...
    99+
    2023-01-31
    进阶 面向对象 成员
  • Python3 面向对象概述
    笔记内容:Python3 面向对象笔记日期:2017-11-13 <br> Python3 面向对象 Python3 面向对象 面向对象技术简介 类的定义 类的对象 类的方法 继承 多继承 方法重写 类的私有属性与私有方法 ...
    99+
    2023-01-31
    面向对象
  • Python基础之面向对象进阶详解
    目录面向对象三大特征介绍继承语法格式查看类的继承层次结构object根类dir()查看对象属性str()方法的重写多重继承MRO()super()获得父类定义多态特殊方法和重载运算符...
    99+
    2024-04-02
  • “PHP面向对象编程进阶指南:掌握面向对象编程思想”
    面向对象编程的基础知识 类: 类是面向对象编程的基本构建块。它定义了对象的属性和方法。 对象: 对象是类的实例。它具有类的所有属性和方法。 方法: 方法是类定义的行为。它可以访问对象的属性,并对它们进行操作。 属性: 属性是类的状态。...
    99+
    2024-02-25
    PHP 面向对象编程 对象 方法 属性
  • C++图文并茂轻松进阶面向对象
    目录一、进阶面向对象(上)二、小结(上)三、进阶面向对象(下)四、小结(下)一、进阶面向对象(上) 面向对象的意义在于 将日常生活中习惯的思维方式引入程序设计中将需求中的概念直观的映...
    99+
    2024-04-02
  • python3第八天(面向对象)
    面向对象技术简介:    类(Class):用来描述具有相同属性的方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.    类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中,具在函数体之外.类变量通常...
    99+
    2023-01-31
    面向对象 第八天
  • Python3的面向对象举例分析
    这篇文章主要介绍“Python3的面向对象举例分析”,在日常操作中,相信很多人在Python3的面向对象举例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python3的面向对象举例分析”的疑惑有所帮助!...
    99+
    2023-06-19
  • python3面向对象注意事项
    一。面向对象super的作用: class parent(object): def __init__(self): self.test() def test(self): print...
    99+
    2023-01-30
    面向对象 注意事项
  • Python3 系列之 面向对象篇
    面向对象的三大特性:继承、封装和多态 Python 做到胶水语言,当然也支持面向对象的编程模式。 封装 class UserInfo(object): lv = 5 def __init__(self, name, ...
    99+
    2023-01-30
    面向对象 系列之
  • python3--面向对象--综合练习
    一 基础知识:1  文件操作有哪些模式?请简述各模式的作用r:只读w:只写a:追加r+:可读可写w+:可写可读a+:追加、读rb:读取字节wb:写入字节ab:追加字节rb+:字节的可读可写wb+:字节的可写可读ab+:字节的追加、...
    99+
    2023-01-30
    面向对象
  • Python3面向对象—点和矩形类
    Python类练习 定义一个类 class Point: '''二维坐标系中代表一个点''' pass print('打印Point:{}'.format(Point)) p1 = Point() print('Point...
    99+
    2023-01-30
    矩形 面向对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作