ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十七课(类变量、方法、继承、覆盖)

ParisGabriel

每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰

  开局一张图

                      Python人工智能从入门到精通

补充:

  实例方法都是操作实例对象的 属于此类对象的方法

  实例变量
    添加/修改属性:
      对象.属性名 = 表达式
    删除:
      del 对象.属性名

      类      |           对象   |     实例
      class         object          instance

类的本质上也是对象 类可以创建此类对象

-----------------------------------------------------------------------------------------------------------------

类:
  类变量:
    类变量是类的属性, 此属性属于类, 不属于此类的实例
  作用:
    通常用来储存该类创建的对象的共同属性
  说明:
    类变量可以通过该类的实例直接访问
    类变量可以通过类的实例间接访问
    类变量可以通过此类对象__class__属性间接访问
示例:

# -*- coding:utf-8 -*-

# 类变量

class Human:
    total_count = 0  # 类变量

    def __init__(self, name):
        print(name, ‘对象被创建‘)

print(Human.total_count)  # 0
h1 = Human("zhang")
print(h1.total_count)  # 0 用此类实例访问类变量
h1.total_count = 100  # 为对象添加实例变量
print(h1.total_count)  # 100  优先访问实例变量
print(Human.total_count)  # 0 访问类变量

class Human:
    total_count = 0  # 类变量

    def __init__(self, name):
        print(name, ‘对象被创建‘)

h1 = Human("zhang")
print(Human.total_count)  # 0
h1.__class__.total_count = 100  # 为类添加修改实例变量
print(h1.total_count)  # 100  间接访问类变量
print(Human.total_count)  # 100 访问类变量

# 类变量的应用  用类变量记录实例个数

class Human:
    total_count = 0  # 类变量

    def __init__(self, name):
        print(name, ‘对象被创建‘)
        self.__class__.total_count += 1  # 每次创建对象调用__init__ 类变量加1

    def __del__(self):
        self.__class__.total_count += 1  # 每次析构对象后类变量减1

h1 = Human("zhang")
print("此时Human对象的个数是", Human.total_count)  # 1
L = []
L.append(Human("li"))
L.append(Human("zhao"))
print("此时Human对象的个数是", Human.total_count)  # 3
del h1
L.pop()
print("此时Human对象的个数是", Human.total_count)  # 1

类的文档字符串:
  和函数等一样
  用__doc__属性访问
示例:

>>> class Dog:
...     ‘‘‘这是小动物‘‘‘
...
>>> help(Dog)

>>> Dog.__doc__
‘这是小动物‘
>>> 

类 __slots__ 列表:
  作用:
    限定一个创建实例只能有固定属性(实例变量)
    不允许对象添加列表以外的属性(实例变量)
    防止用户因错写属性的名称而发生错误
  说明:

    1.__slots__ 列表绑定一个字符串列表
    2.含有__slots__列表的类所创建的实例对象没有__dict__属性
(不用字典储存对象的属性 __slots__限制)
  示例:

class Human:
    # 以下列表限制此类对象只能有这两个属性 防止出错
    __slots__ = ["name", "age"]

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

h1 = Human("Ta", 15)
print(h1.age)  # 15
h1.Age = 18  # 区分大小写 出错 没有Age属性,也不允许有
print(h1.age)  # 15

类方法 @ classmethod
  类方法是用于描述类行为的方法 类方法属于类不属于类的实例
  说明:
    类方法需要使用  @classmethod 装饰器定义
    类方法至少一个形参第一个形参用于绑定类, 约定写“cls”
    类和该类的实例都可以调用类的方法
    类方法不能访问此类创建的实例的属性
示例:

# 类方法的使用

class A:
    v = 0

    @classmethod
    def get_v(cls):  # cls 用来绑定调用此方法的类
        return cls.v  # 访问类变量

    @classmethod
    def set_v(cls, value):
        cls.v = value

print(A.get_v())  # 0
A.set_v(100)
print(A.get_v())  # 100
a1 = A()  # 创建实例
print("a1.get_v=", a1.get_v)  # 100
a1.set_v(200)
print("a1.get_v=", a1.get_v)  # 200
print("A.get_v=", A.get_v)  # 200

静态方法 @staticmethod
  静态方法是定义在类内部的函数, 此函数的作用域类的内部
  说明:
    静态方法需要使用 @staticmethod 装饰器定义
    静态方法与普通函数定义相同不需要传入self实例参数和cls参数
    静态方法只能凭借类的创建实例调用
    静态方法不能访问变量和实例变量(属性)
示例:

# 静态方法

class A:
    @staticmethod
    def myadd(a, b):
        return a + b

print(A.myadd(100, 200))  # 300
a = A()  # 创建实例
print(a.myadd(300, 400))  # 700

# def myadd(a, b):  # 和静态方法结果一样
#     return a + b

# class A:
#     pass

# print(A.myadd(100, 200))  # 300
# a = A()  # 创建实例
# print(a.myadd(300, 400))  # 700

实例方法, 类方法, 静态方法,函数, 小结:
  1.访问 类内 的和 实例内变量, 用静态方法
  2.访问类变量, 不想访问实例变量, 用类方法
  3.访问类变量, 访问实例变量, 用实例方法
  4.函数与静态方法相同只是静态方式的作用域定义在类内

继承inheritance/派生derive:
  什么是继承/派生:
  继承是从已有的类中派生出新的类, 新类具有原类的行为并能扩充新的行为
  派生是从已有的类中衍生成新类, 在新类上可以添加新的属性和行为
  作用:
    用继承派生机制, 可以将一些共有的功能加在基类中, 实现代码的共享
    在不改变基类的代码的基础上改变原有的功能
  名词:
    基类(base class) / 超类(super class)/父类(father class)
    派生类(derived class)/子类(child class)
    子类对象一定是父类对象的类型
    父类对象不一定是子类对象的类型
单继承:
  语法:
    class 类名(基类名)
      语句块
  说明:
    单继承是指由一各基类衍生出新的类

示例:

# 单继承用法

class Human:  # 人类的共性
    def say(srlf, what):
        print("说:", what)

    def walk(self, distance):  # 走路
        print("走了", distance, "公里")

class Student(Human):  # 继承
    # def say(srlf, what):
    #     print("说:", what)

    # def walk(self, distance):  # 走路
    #     print("走了", distance, "公里")

    def study(self, subject):  # 派生
        print("学习", subject)

class Teacher(Student):
    def teach(self, subject):  # 派生
        print("教", subject)

h1 = Human()
h1.say("哈哈")
h1.walk(500)

s1 = Student()
s1.walk(4)
s1.say("666")
s1.study("python")

T1 = Teacher()
T1.walk(4)
T1.say("666")
T1.teach("python")
T1.study("Java")

继承说明:
  python3 任何类都可以直接或间接的继承object类
  object 类是一切类的超类(父类)
  class的继承参数不写默认继承object类   一般省略不写
  object类的超类是None
类的__base__属性:
  __base__ 属性用来记录此类的基类(父类)
Python的内建类:
  help(__builtins__)

覆盖 override
  覆盖是指在有继承关系的类中, 子类中实现了与基类同名的方法, 在子类
  的实例调用该方法时, 实际调用的是子类的覆盖版本, 这种现象叫覆盖
示例:

# 覆盖 override

class A:
    def works(self):
        print("A.works被调用")

class B(A):
    ‘‘‘B继承A类‘‘‘
    def works(self):
        print("B.works被调用")

b = B()
b.works()  # B.works被调用
# B.works 覆盖 A.works 优先调用子类 
# A派生B  B继承A

# 子类对象显示调用基类(被覆盖)方法的方式:
#   基类.方法名(实例, 实际调用参数)

A.works(b)  # 用类名显示调用, A.works被调用

super 函数:
  super(cls, obj)返回绑定超类的实例(要求obj必须是cls类的实例)
  super() 返回绑定超类的实例等同于:super(__class__),
  实例方法的第一个参数), 必须在方法内调用
  作用:
    借助于super()返回实例间接调用其父类的覆盖方法

# 用super函数返回的对象调用父类的覆盖方法

class A:
    def works(self):
        print("A.works被调用")

class B(A):
    ‘‘‘B继承A类‘‘‘
    def works(self):
        print("B.works被调用")

    def super_works(self):
        self.works()  # B.works被调用
        super(B, self).works()  # A.works被调用
        super().works()  # A.works被调用

b = B()
b.works()  # B.works被调用
super(B, b).works()  # A.works被调用

b = B()
b.super_works()  # B.works被调用

显示调用基类的初始化方法:
  当子类中实现了__init__方法,基类的构造方法不会被调用
  def __init__(self, ...)

# 用super函数调用父类的覆盖__init__初始化方法

class Human:
    def __init__(self, n, a):
        self. name, self.age = n, a
        print("Human类的 __init__ 方法被调用")

    def infos(self):
        print("name:", self.name)
        print("age:", self.age)

class Student(Human):
    def __init__(self, n, a, s=0):
        super().__init__(n, a)  # 用siper 调用父类的__init__方法
        self.score = s  # 添加成绩属性
        print("Student类的 __init__ 方法被调用")

    def info(self):
        super().infos()  # 调用父类的方法
        print("name:", self.name)
        print("age:", self.age)
        print("score:", self.score)  # 不调用父类的方法也不会出错 但是尽量不要用

s1 = Student("小张", 20)
s1.infos()

原文地址:https://www.cnblogs.com/ParisGabriel/p/9368942.html

时间: 2024-10-14 22:14:22

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十七课(类变量、方法、继承、覆盖)的相关文章

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

Python全栈开发【基础四】

Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 匿名函数 lambda表达式:对于简单的函数,存在一种简便的表示方式,即lambda表达式 1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10)) 匿名函数主要是和其它函数搭配使用 举例: 1 ########

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十二课(迭代器、字节串)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 迭代器 Iterator: 用<>括号表示的一定是对象 什么是迭代器? 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj) 函数返回的对象(实例) 迭代器可以用next(it) 函数获取可迭代对象的数据 迭代器函数iter和next iter(iterable) 从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象 next(iterator

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十课(包、模块 的导入)

$ pip3 install tensorflow : 第三方模块 tensorflow 的安装 电脑必须有网 命令行自动下载安装dir(模块名): 查看模块所有属性 自定义模块导入 示例: 自定义模块的实现方法 def myfac(n): print('正在计算', n, '的阶乘') def mysum(n): print("正在计算1+2+3+...+%d的和" % n) name1 = "Audi" name2 = "TESLA" pri

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十三课(每周总结:2)

ParisGabriel 每天坚持 一天一篇 点个订阅吧  灰常感谢    当个死粉也阔以 week summer: Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细小的功能,一系列函数的任意组合可以完成 大问题 函数仅接受输入并产生输入,不包含任何影响输出的内部 状态函数的可重用性: 如果一个函数的输入参数一定,则返回结果必须一定的函数 称为可重用函数 可重入和不可重入就是访问除局部变量以外的变量函数式编程要求: def 创建函数最好不要访问局部作用域

ParisGabriel:Python全栈工程师(0基础到精通)教程 第十三课

ParisGabriel 感谢 大家的支持  你们的阅读评价就是我最好的动力  我会坚持把排版内容以及偶尔的错误做的越来越好 每天坚持 一天一篇 点个订阅吧  灰常感谢    当个死粉也阔以      Python人工智能从入门到精通 集合 set:         集合是可变的容器         集合内的数据对象都是唯一的(不能重复的) 集合是无序的储存结构.集合中的数据没有先后顺序关系 集合内的元素必须是不可变对象 集合是可迭代对象 集合相当于只有键没有值得字典(键则是集合的数据) (相当

ParisGabriel:Python全栈工程师(0基础到精通)教程 第十五课(函数嵌套、变量作用域)

ParisGabriel 感谢 大家的支持 每天坚持 一天一篇 点个订阅吧  灰常感谢    当个死粉也阔以 Python人工智能从入门到精通 globals()/locals()函数: globals()返回当前全局作用域内变量的字典 locals() 返回当前局部作用域内变量的字典函数变量: 函数名是变量,它在def 语句创建时绑定函数 fa1 = fa 没有括号 绑定函数 fa1 = fa() 返回结果 函数的变量名可以序列交换算法一个函数可以作为另一个函数的实参传递: 例如: def m

ParisGabriel:Python全栈工程师(0基础到精通)教程 第二十一课(包、模块 的导入)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 补充:包的相对导入 只对后两种导入方式有用 包的相对导入 只对后两种导入方式有用 异常(基础)except: 什么是错误: 是指由于逻辑或语法等导程序无法正常执行的问题 什么是异常: 是程序出错的标识符的一种状态 当异常发时 程序不会再向下执行,而转去调用此函数的地方 待处理此错误并恢复为正常状态 异常的作用: 用作信号, 通知上层调用者有错误产生需要处理try 语句: 两种语