别院牧志知识库 别院牧志知识库
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2025 面试记录
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
首页
  • 基础

    • 全栈之路
    • 😎Awesome资源
  • 进阶

    • Python 工匠系列
    • 高阶知识点
  • 指南教程

    • Socket 编程
    • 异步编程
    • PEP 系列
  • 面试

    • Python 面试题
    • 2025 面试记录
    • 2022 面试记录
    • 2021 面试记录
    • 2020 面试记录
    • 2019 面试记录
    • 数据库索引原理
  • 基金

    • 基金知识
    • 基金经理
  • 细读经典

    • 德隆-三个知道
    • 孔曼子-摊大饼理论
    • 配置者说-躺赢之路
    • 资水-建立自己的投资体系
    • 反脆弱
  • Git 参考手册
  • 提问的智慧
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 辨析

  • Sockets编程

  • Django

  • stackoverflow

  • Flask

  • 全栈之路

    • 基础篇

    • 进阶篇

    • 面向对象

      • Python 全栈之路系列之面向对象类成员特性
      • Python 全栈之路系列之面向对象成员修饰符
      • Python 全栈之路系列之面向对象运算符重载
      • Python 全栈之路系列之面向对象进阶及类成员
        • 再次了解多继承
        • 执行父类的构造方法
        • 利用反射查看面向对象成员归属
        • 利用反射导入模块、查找类、创建对象、查找对象中的字段
        • 面向对象类成员之静态字段
        • 面向对象类成员之静态方法
        • 面向对象类成员之类方法
        • 面向对象类成员内容梳理
      • Python 全栈之路系列之面向对象基础
      • Python 全栈之路系列之面向对象特殊成员
    • 网络编程

    • 操作系统

    • 标准库

    • 第三方库

    • Python 全栈之路
  • 面试

  • 代码片段

  • 异步编程

  • 😎Awesome资源

  • PEP

  • Python工匠系列

  • 高阶知识点

  • Python 学习资源待整理
  • 设计模式

  • 好“艹蛋”的 Python 呀!
  • FIFO | 待学清单📝
  • pip 安装及使用
  • 数据分析

  • 源码阅读计划

  • OOP

  • 关于 python 中的 setup.py
  • 并行分布式框架 Celery
  • 七种武器,让你的代码提高可维护性
  • 使用 pdb 调试 Python 代码
  • 每周一个 Python 标准库
  • 🐍Python
  • 全栈之路
  • 面向对象
佚名
2020-05-23
目录

Python 全栈之路系列之面向对象进阶及类成员

# 再次了解多继承

先来一段代码

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

class A:
    def bar(self):
        print("BAR")
        self.f1()

class B(A):
    def f1(self):
        print("B")

class C:
    def f1(self):
        print("C")

class D(C, B):
    pass

obj = D()
obj.bar()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

执行结果

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s1.py
BAR
C

Process finished with exit code 0
1
2
3
4
5

流程释意:

  1. 创建了类 A、B、C、D;
  2. D继承了C和B,B继承了A,D内什么都不做,pass;
  3. 创建一个对象obj,类是D,当执行D的bar方法的时候会先从C里面寻找有没有bar方法;
  4. C内没有bar方法,然后继续从B里面查找,B里面也没有,B的父类是A,A里面有bar方法,所以就执行了A的bar方法;
  5. A的bar方法首先输出了BAR;
  6. 然后又执行了self.f1(),self=obj,相当于执行了obj.f1();
  7. 执行obj.f1()的时候先从C里面查找有没有f1这个方法,C里面有f1这个方法;
  8. 最后就执行C里面的f1方法了,输出了C

# 执行父类的构造方法

class Annimal(object):
    def __init__(self):
        print("Annimal的构造方法")
        self.ty = "动物"

class Cat(Annimal):
    def __init__(self):
        print("Cat的构造方法")
        self.n = "猫"
        # 寻找Cat类的父类,然后执行父类的构造方法
        super(Cat, self).__init__()
mao = Cat()
print(mao.__dict__)
1
2
3
4
5
6
7
8
9
10
11
12
13

执行结果

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s1.py
Cat的构造方法
Annimal的构造方法
{'ty': '动物', 'n': '猫'}

Process finished with exit code 0
1
2
3
4
5
6

先执行了 Cat 的构造方法,然后又执行了 Annimal 的构造方法。 第二种执行父类的方法如下:

Annimal.__init__(self)
1

不推荐使用

# 利用反射查看面向对象成员归属

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

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

    def show(self):
        print('show')


obj = Foo("as")

# 如果是类,就只能找到类里的成员
print(hasattr(Foo, "show"))

# 如果是对象,既可以找到对象,也可以找类里的成员
print(hasattr(obj, "name"))
print(hasattr(obj, "show"))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

执行结果

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day03/s2.py
True
True
True

Process finished with exit code 0
1
2
3
4
5
6

# 利用反射导入模块、查找类、创建对象、查找对象中的字段

s1脚本文件内容:

#!/usr/bin/env python
# _*_coding:utf-8 _*_

# 导入模块
m = __import__('s2', fromlist=True)

# 去模块中找类
class_name = getattr(m, "Foo")

# 根据类创建对象
obj = class_name("ansheng")

# 去对象中找name对应的值
print(getattr(obj, 'name'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14

s2脚本文件内容

#!/usr/bin/env python
# _*_coding:utf-8 _*_

class Foo:
    def __init__(self, name):
        # 普通字段,保存在对象中
        self.name = name

1
2
3
4
5
6
7
8

执行结果:

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s1.py
ansheng

Process finished with exit code 0

1
2
3
4
5

# 面向对象类成员之静态字段

静态字段存在类中,如下:

#!/usr/bin/env python
# _*_coding:utf-8 _*_

# 静态字段存在的意义就是将每个对象中重复的东西在类里面保存一份即可,这就是静态字段

class Provice:

    # 静态字段
    contry = "China"

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

    def show(self):
        print(Provice.contry, self.name)

hebei = Provice("河北")
hebei.show()

hubei = Provice("湖北")
hubei.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

执行结果

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py
China 河北
China 湖北

Process finished with exit code 0
1
2
3
4
5

类里面的成员类去访问,对象内的成员用对象去访问。

# 面向对象类成员之静态方法

#!/usr/bin/env python
# _*_coding:utf-8 _*_

class Foo:

    # 静态方法括号内没有self,切方法前一行要加上@staticmethod
    @staticmethod
    def static():
    # def static(arg1, arg2): # 也可以设置参数
        print("static")

# 静态方法通过类名+方法名既可执行
Foo.static()
# Foo.static("arg1", "arg2") 通过类调用的时候传入对于的参数即可

# 静态方法也可以通过对象去访问,对于静态方法用类去访问
obj = Foo()
obj.static()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

执行结果

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py
static
static

Process finished with exit code 0
1
2
3
4
5

# 面向对象类成员之类方法

#!/usr/bin/env python
# _*_coding:utf-8 _*_

class Foo:

    # 创建类方法的时候需要在方法前面加上@classmethod
    @classmethod
    def ClassMethod(cls): # 并且方法的括号内必须带有cls关键字,类方法的参数是当前类的类名
        print("类方法")

# 调用类方法
Foo.ClassMethod()
1
2
3
4
5
6
7
8
9
10
11
12

执行结果:

/usr/bin/python3.5 /home/ansheng/文档/Python_code/sublime/Week06/Day04/s2.py
类方法

Process finished with exit code 0
1
2
3
4

# 面向对象类成员内容梳理

字段

1.静态字段(每个对象都有一份) 2.普通字段(每个对象都不同的数据)

方法

1.静态方法(无需使用对象封装的内容) 2.类方法 3.普通方法(适用对象中的数据)

特性

1.普通特性(将方法未造成字段)

快速判断,类执行、对象执行:

1.self --> 对象调用 2.无 self --> 类调用

编辑 (opens new window)
#编码
上次更新: 2024-07-23, 01:00:43
Python 全栈之路系列之面向对象运算符重载
Python 全栈之路系列之面向对象基础

← Python 全栈之路系列之面向对象运算符重载 Python 全栈之路系列之面向对象基础→

最近更新
01
2025 面试记录
05-28
02
提升沟通亲和力的实用策略
03-26
03
工作
07-15
更多文章>
Theme by Vdoing | Copyright © 2019-2025 IMOYAO | 别院牧志
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式