Python全栈工程师 (类变量、方法、继承、覆盖)
Python人工智能从入门到精通
补充:
实例方法都是操作实例对象的 属于此类对象的方法
实例变量
添加/修改属性:
对象.属性名 = 表达式
删除:
del 对象.属性名
类 | 对象 | 实例
class object instance
类的本质上也是对象 类可以创建此类对象
-----------------------------------------------------------------------------------------------------------------
类:
类变量:
类变量是类的属性, 此属性属于类, 不属于此类的实例
作用:
通常用来储存该类创建的对象的共同属性
说明:
类变量可以通过该类的实例直接访问
类变量可以通过类的实例间接访问
类变量可以通过此类的对象__class__属性间接访问
示例:
# -*- coding:utf-8 -*- # 类变量 class Human:
total_count = 0 # 类变量 def __init__(self, name):
print(name, '对象被创建') print(Human.total_count) #
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) #
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) #
L = []
L.append(Human("li"))
L.append(Human("zhao"))
print("此时Human对象的个数是", Human.total_count) #
del h1
L.pop()
print("此时Human对象的个数是", Human.total_count) #
类的文档字符串:
和函数等一样
用__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) #
h1.Age = 18 # 区分大小写 出错 没有Age属性,也不允许有
print(h1.age) #
类方法 @ 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()) #
A.set_v(100)
print(A.get_v()) #
a1 = A() # 创建实例
print("a1.get_v=", a1.get_v) #
a1.set_v(200)
print("a1.get_v=", a1.get_v) #
print("A.get_v=", A.get_v) #
静态方法 @staticmethod
静态方法是定义在类内部的函数, 此函数的作用域是类的内部
说明:
静态方法需要使用 @staticmethod 装饰器定义
静态方法与普通函数定义相同, 不需要传入self实例参数和cls参数
静态方法只能凭借该类的创建实例调用
静态方法不能访问变量和实例变量(属性)
示例:
# 静态方法 class A:
@staticmethod
def myadd(a, b):
return a + b print(A.myadd(100, 200)) #
a = A() # 创建实例
print(a.myadd(300, 400)) # # 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("")
s1.study("python") T1 = Teacher()
T1.walk(4)
T1.say("")
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()
Python全栈工程师 (类变量、方法、继承、覆盖)的更多相关文章
- Python全栈工程师(多继承、函数重写)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 补充: 对象 --------- ...
- Python全栈工程师(装饰器、模块)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 装饰器 decorators(专业提高篇) 装饰 ...
- Python全栈工程师(递归函数、闭包)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 全栈工程师 Python人工智能从入门到精通 函数式编程: 是指用一系列函数解决问题 每一个函数完成细 ...
- 【目录】python全栈工程师
第一阶段:Python 语言核心编程1. Python核心 -- 2048 游戏核心算法2. 面向对象 -- 天龙八部游戏技能系统3. Python高级 -- 集成操作框架项目:2048游 ...
- Python全栈工程师之从网页搭建入门到Flask全栈项目实战(1) - ES6标准入门和Flex布局
1.简述 1.什么是ES6?ES6, 全称 ECMAScript 6.0,是 JavaScript 的下一个版本标准,2015年6月份发版.ES6的主要目的是为了解决 ES5 的先天不足. 2.了解E ...
- Python全栈工程师(Python3 所有基础内容 0-0)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python一个月的基础语法 基本就到这咯 接下来是数据 ...
- Python全栈工程师(Python3 所有基础内容 0-0)
转发:https://www.cnblogs.com/ParisGabriel/p/9388030.html statements 语句print 输出quit() 退出exit() 退出ct ...
- Python全栈工程师(面向对象)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 day16补充: 异常处理 文件 ...
- Python全栈工程师(包、模块 的导入)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想 为了信仰 Python人工智能从入门到精通 $ pip3 install tenso ...
随机推荐
- Mac下安装OpenCV3.0和Anaconda和环境变量设置
入手Mac几天了,想在Mac OS下玩玩OpenCV和keras,间歇捣鼓了两天,终于搞定zsh.OpenCV3.0以及Anaconda.OpenCV3.0刚发布不久,这方面的资料也不是很多,能够查到 ...
- matlab时间测试
因为想把样本筛选一下,所以简单的分类器先跑了一下,没想到跑完分类器在对样本筛选时的时间大大超过了样本进分类器的时间,这个显然不能达到我要的节省时间目的.于是分析了一下matlab中各个环节的时间成本, ...
- caffe中的sgd,与激活函数(activation function)
caffe中activation function的形式,直接决定了其训练速度以及SGD的求解. 在caffe中,不同的activation function对应的sgd的方式是不同的,因此,在配置文 ...
- django中的构造字典(二级菜单,评论树,购物车)
1.构造父子结构: 1.1需求样式 客户列表 customer_list /customer/list/ -----> 添加客户 customer_add /customer/add/ ---- ...
- 学习JavaScript一些资料时,记录一些规范小记
最近工作不是很忙,所以再深入学学JavaScript,顺便提升一下自己,嘿嘿!主要记录一下学习到的一下编写代码的规范小记吧! 1.声明变量时一定带上var,避免一些错误发生,如变量提升时遇见的问题发生 ...
- 常用的功能封装 pool.js
//import { setInterval } from "timers"; //获取最大值 function getMax(){ var max = arguments[0]; ...
- spring-mybatis整合异常
Failed to read artifact descriptor for XXXXXX:jar:XXXX.RELEAS 原因是maven的本地仓库没有设置好.在别处拷贝过来的项目会有自己的仓库位置 ...
- Angular环境配置
1.安装node.js 访问官方网站:https://nodejs.org/en/下载node.js,直接下一步安装即可.安装完成打开cmd命令窗口输入node -v出现node版本号安装成功. 2. ...
- 交换机基础配置之结合以太通道的vlan设置
我们将以上面的拓扑图来做实验,建立以太通道,并设置好vlan,将pc1和pc3放在同一vlan,将pc2和pc4放在同一vlan,同一vlan能跨交换机通信 在一切还没布置之前,四台pc机都在同一网段 ...
- Ubuntu 18.04 配置
Ubuntu 18.04 配置IP-静态(UB与其他linux os不同) sudo netplan generate sudo vim /etc/netplan/50-cloud-init.yaml ...