Python对象基础
类
定义操作
# 1. 定义类class Washer():def wash(self):print('我会洗⾐服')def print_info(self):# 类⾥⾯获取实例属性print(f'haier1洗⾐机的宽度是{self.width}')print(f'haier1洗⾐机的⾼度是{self.height}')# 2. 创建对象
haier1 =Washer()
# <__main__.Washer object at 0x0000018B7B224240>
print(haier1)
# haier1对象调⽤实例⽅法# 3. 添加实例属性
haier1.width = 500
haier1.height = 800
# 4. 获取实例的对象
print(f'haier1洗⾐机的宽度是{haier1.width}')
print(f'haier1洗⾐机的⾼度是{haier1.height}')
魔法⽅法
在Python中, xx() 的函数叫做魔法⽅法,指的是具有特殊功能的函数
1. init()
注意
init() ⽅法,在创建⼀个对象时默认被调⽤,不需要⼿动调⽤
init(self) 中的self参数,不需要开发者传递,python解释器会⾃动把当前的对象引⽤传递过去。
class Washer():# 定义初始化功能的函数
def __init__(self):
# 添加实例属性self.width = 500self.height = 800
def print_info(self):
# 类⾥⾯调⽤实例属性
print(f'洗⾐机的宽度是{self.width}, ⾼度是{self.height}')
haier1 = Washer()
haier1.print_info()
2.带参数的init()
⼀个类可以创建多个对象,传参数
对不同的对象设置不同的初始化属性
class Washer():def __init__(self, width, height):self.width = widthself.height = heightdef print_info(self):print(f'洗⾐机的宽度是{self.width}')print(f'洗⾐机的⾼度是{self.height}')
haier1 = Washer(10, 20)
haier1.print_info()
haier2 = Washer(30, 40)
haier2.print_info()
3. str__()
当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 str ⽅法,那么就会打印从在这个⽅法中 return 的数据。
class Washer():def __init__(self, width, height):self.width = widthself.height = heightdef __str__(self):return '这是海尔洗⾐机的说明书'
haier1 = Washer(10, 20)
# 这是海尔洗⾐机的说明书
print(haier1)
4.del()
当删除对象时,python解释器也会默认调⽤ del() ⽅法。
class Washer():def __init__(self, width, height):self.width = widthself.height = heightdef __del__(self):print(f'{self}对象已经被删除')
haier1 = Washer(10, 20)
# <__main__.Washer object at 0x0000026118223278>对象已经被删除
del haier1
总结
类
创建类
class 类名():代码
对象
对象名 = 类名()
添加对象属性
- 类外面
对象名.属性名 = 值
- 类⾥⾯
self.属性名 = 值
获取对象属性
- 类外面
对象名.属性名
- 类⾥⾯
self.属性名
魔法方法
init_() : 初始化
str__() :输出对象信息
del() :删除对象时调⽤
继承
单继承
# 1. 师⽗类
class Master(object):def __init__(self):self.kongfu = '[古法煎饼果⼦配⽅]'def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')# 2. 徒弟类
class Prentice(Master):pass
# 3. 创建对象daqiu
daqiu = Prentice()
# 4. 对象访问实例属性
print(daqiu.kongfu)
# 5. 对象调⽤实例⽅法
daqiu.make_cake()
多继承
class Master(object):def __init__(self):self.kongfu = '[古法煎饼果⼦配⽅]'def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')# 创建学校类
class School(object):def __init__(self):self.kongfu = '[⿊⻢煎饼果⼦配⽅]'def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')
class Prentice(School, Master):pass
daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()
注意:当⼀个类有多个⽗类的时候,默认使⽤第⼀个⽗类的同名属性和⽅法。
⼦类和⽗类具有同名属性和⽅法,默认使⽤⼦类的同名属性和⽅法。
⼦类调⽤⽗类的方法
class Master(object):def __init__(self):self.kongfu = '[古法煎饼果⼦配⽅]'def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')class School(object):def __init__(self):self.kongfu = '[⿊⻢煎饼果⼦配⽅]'def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')class Prentice(School, Master):def __init__(self):self.kongfu = '[独创煎饼果⼦配⽅]'def make_cake(self):# 如果是先调⽤了⽗类的属性和⽅法,⽗类属性会覆盖⼦类属性,故在调⽤属性前,先调⽤⾃⼰⼦类的初始化self.__init__()print(f'运⽤{self.kongfu}制作煎饼果⼦')# 调⽤⽗类⽅法,但是为保证调⽤到的也是⽗类的属性,必须在调⽤⽅法前调⽤⽗类的初始化def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)def make_cake1(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')# ⽅法2.1# super(School, self).__init__()# super(School, self).make_cake()# ⽅法2.2super().__init__()super().make_cake()daqiu = Prentice()
daqiu.make_cake()
daqiu.make_master_cake()
daqiu.make_school_cake()
daqiu.make_cake()
super方法
class Prentice(School, Master):def __init__(self):self.kongfu = '[独创煎饼果⼦配⽅]'def make_cake(self):# 如果是先调⽤了⽗类的属性和⽅法,⽗类属性会覆盖⼦类属性,故在调⽤属性前,先调⽤⾃⼰⼦类的初始化self.__init__()print(f'运⽤{self.kongfu}制作煎饼果⼦')# 调⽤⽗类⽅法,但是为保证调⽤到的也是⽗类的属性,必须在调⽤⽅法前调⽤⽗类的初始化def make_master_cake(self):Master.__init__(self)Master.make_cake(self)def make_school_cake(self):School.__init__(self)School.make_cake(self)def make_cake1(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')# ⽅法2.1# super(School, self).__init__()# super(School, self).make_cake()# ⽅法2.2super().__init__()super().make_cake()# ⼀次性调⽤⽗类的同名属性和⽅法# 注意:使⽤super() 可以⾃动查找⽗类。调⽤顺序遵循 __mro__ 类属性的顺序。⽐较适合单继承使⽤。def make_old_cake(self):# ⽅法⼀:代码冗余;⽗类类名如果变化,这⾥代码需要频繁修改# Master.__init__(self)# Master.make_cake(self)# School.__init__(self)# School.make_cake(self)# ⽅法⼆: super()# ⽅法2.1 super(当前类名, self).函数()# super(Prentice, self).__init__()# super(Prentice, self).make_cake()# ⽅法2.2 super().函数()super().__init__()super().make_cake()
私有权限
在Python中,可以为实例属性和⽅法设置私有权限,即设置某个实例属性或实例⽅法不继承给⼦类。
设置私有权限的⽅法:在属性名和⽅法名 前⾯ 加上两个下划线 __
私有属性和私有⽅法只能在类⾥⾯访问和修改。
在Python中,⼀般定义函数名 get_xx
⽤来获取私有属性,定义 set_xx
⽤来修改私有属性值。
class Master(object):
def __init__(self):self.kongfu = '[古法煎饼果⼦配⽅]'
def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')class School(object):
def __init__(self):self.kongfu = '[⿊⻢煎饼果⼦配⽅]'
def make_cake(self):print(f'运⽤{self.kongfu}制作煎饼果⼦')class Prentice(School, Master):
def __init__(self):self.kongfu = '[独创煎饼果⼦配⽅]'# 定义私有属性self.__money = 2000000# 定义私有⽅法
def __info_print(self):print(self.kongfu)print(self.__money)
def make_cake(self):self.__init__()print(f'运⽤{self.kongfu}制作煎饼果⼦')
def make_master_cake(self):Master.__init__(self)Master.make_cake(self)
def make_school_cake(self):School.__init__(self)School.make_cake(self)
# 徒孙类
class Tusun(Prentice):
pass
daqiu = Prentice()
# 对象不能访问私有属性和私有⽅法
# print(daqiu.__money)
# daqiu.__info_print()
xiaoqiu = Tusun()
# ⼦类⽆法继承⽗类的私有属性和私有⽅法
# print(xiaoqiu.__money) # ⽆法访问实例属性__money
# xiaoqiu.__info_print()
总结
继承的特点
- ⼦类默认拥有⽗类的所有属性和⽅法
- ⼦类重写⽗类同名⽅法和属性
- ⼦类调⽤⽗类同名⽅法和属性
super()⽅法快速调⽤⽗类⽅法
私有权限
- 不能继承给⼦类的属性和⽅法需要添加私有权限
- 语法
class 类名():# 私有属性__属性名 = 值# 私有⽅法def __函数名(self):代码
多态
类属性
- 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有。
- 类属性可以使⽤ 类对象 或 实例对象 访问
类属性的优点
类的实例 记录的某项数据 始终保持⼀致时,则定义类属性。
实例属性要求每个对象为其 单独开辟⼀份内存空间 来记录数据,⽽ 类属性 为全类所共有,仅占⽤⼀份内存,更加节省内存空间。
## 类属性和实例属性
class Dog(object):tooth = 10
wangcai = Dog()
xiaohei = Dog()
print(Dog.tooth) # 10
print(wangcai.tooth) # 10
print(xiaohei.tooth) # 10
修改类属性
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。
class Dog(object):tooth = 10
wangcai = Dog()
xiaohei = Dog()# 修改类属性
Dog.tooth = 12
print(Dog.tooth) # 12
print(wangcai.tooth) # 12
print(xiaohei.tooth) # 12# 不能通过对象修改属性,如果这样操作,实则是创建了⼀个实例属性
wangcai.tooth = 20
print(Dog.tooth) # 12
print(wangcai.tooth) # 20
print(xiaohei.tooth) # 12
实例属性
class Dog(object):def __init__(self):self.age = 5def info_print(self):print(self.age)
wangcai = Dog()
print(wangcai.age) # 5
# print(Dog.age) # 报错:实例属性不能通过类访问
wangcai.info_print() # 5
类⽅法和静态⽅法
类⽅法特点
- 第⼀个形参是类对象的⽅法
- 需要⽤装饰器 @classmethod 来标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以cls 作为第⼀个参数。
类⽅法使⽤场景
- 当⽅法中 需要使⽤类对象 (如访问私有类属性等)时,定义类⽅法
- 类⽅法⼀般和类属性配合使⽤
class Dog(object):__tooth = 10@classmethoddef get_tooth(cls):return cls.__tooth
wangcai = Dog()
result = wangcai.get_tooth()
print(result) # 10
静态⽅法
静态⽅法特点
需要通过装饰器 @staticmethod 来进⾏修饰,静态⽅法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)。
静态⽅法 也能够通过 实例对象 和 类对象 去访问。
静态⽅法使⽤场景
- 当⽅法中 既不需要使⽤实例对象(如实例对象,实例属性),也不需要使⽤类对象 (如类属性、类⽅法、创建实例等)时,定义静态⽅法
- 取消不需要的参数传递**,有利于 **减少不必要的内存占⽤和性能消耗
class Dog(object):@staticmethoddef info_print():print('这是⼀个狗类,⽤于创建狗实例....')
wangcai = Dog()
# 静态⽅法既可以使⽤对象访问⼜可以使⽤类访问
wangcai.info_print()
Dog.info_print()
总结
类⽅法
@classmethod
def xx():代码
静态⽅法
@staticmethod
def xx():代码
异常
常规写法
try:可能发⽣错误的代码
except:如果出现异常执⾏的代码## 常规写法
try:print(num)
except NameError:print('有错误')## 捕获异常描述信息
try:print(num)
except (NameError, ZeroDivisionError) as result:print(result)## 捕获所有异常
try:print(num)
except Exception as result:print(result)## 异常的else
## else表示的是如果没有异常要执⾏的代码。
try:print(1)
except Exception as result:print(result)
else:print('我是else,是没有异常的时候执⾏的代码')## 异常的finally
## finally表示的是⽆论是否异常都要执⾏的代码,例如关闭⽂件
try:f = open('test.txt', 'r')
except Exception as result:f = open('test.txt', 'w')
else:print('没有异常,真开⼼')
finally:f.close()
异常的传递
import time
try:f = open('test.txt')try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)print(content)except:# 如果在读取⽂件的过程中,产⽣了异常,那么就会捕获到# ⽐如 按下了 ctrl+cprint('意外终⽌了读取数据')finally:f.close()print('关闭⽂件')
except:print("没有这个⽂件")
⾃定义异常
在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
# ⾃定义异常类,继承Exception
class ShortInputError(Exception):def __init__(self, length, min_len):self.length = lengthself.min_len = min_len# 设置抛出异常的描述信息def __str__(self):return f'你输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'
def main():try:con = input('请输⼊密码:')if len(con) < 3:raise ShortInputError(len(con), 3)except Exception as result:print(result)else:print('密码已经输⼊完成')
main()
总结
## 异常语法
try:可能发⽣异常的代码
except:如果出现异常执⾏的代码
else:没有异常执⾏的代码
finally:⽆论是否异常都要执⾏的代码## 捕获异常
except 异常类型:代码
except 异常类型 as xx:代码## ⾃定义异常
# 1. ⾃定义异常类
class 异常类类名(Exception):代码# 设置抛出异常的描述信息def __str__(self):return ...
# 2. 抛出异常
raise 异常类名()
# 捕获异常
except Exception...
模块和包
模块
Python 模块(Module),是⼀个 Python ⽂件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块能定义函数,类和变量,模块⾥也能包含可执⾏的代码。
导⼊模块的⽅式
- import 模块名
- from 模块名 import 功能名
- from 模块名 import *
- import 模块名 as 别名
- from 模块名 import 功能名 as 别名
### import
# 1. 导⼊模块
import 模块名
import 模块名1, 模块名2...
# 2. 调⽤功能
模块名.功能名()## from..import..
from 模块名 import 功能1, 功能2, 功能3...
from math import sqrt
print(sqrt(9))## from .. import *
from 模块名 import *
from math import *
print(sqrt(9))### as定义别名
# 模块定义别名
import 模块名 as 别名
# 功能定义别名
from 模块名 import 功能 as 别名
制作模块
每个Python⽂件都可以作为⼀个模块,模块的名字就是⽂件的名字。也就是说⾃定义模块名必须要符合标识符命名规则。
## 新建⼀个Python⽂件,命名为 my_module1.py ,并定义 testA 函数。
def testA(a, b):print(a + b)
# 只在当前⽂件中调⽤该函数,其他导⼊的⽂件内不符合该条件,则不执⾏testA函数调⽤
if __name__ == '__main__':testA(1, 1)## 调⽤模块
import my_module1
my_module1.testA(1, 1)
注意
- 如果使⽤ from … import … 或 from … import * 导⼊多个模块的时候,且模块内有同名功能。当调⽤这个同名功能的时候,调⽤到的是后⾯导⼊的模块的功能。
all
如果⼀个模块⽂件中有 all 变量,当使⽤ from xxx import * 导⼊时,只能导⼊这个列表中的元素。
__all__ = ['testA']def testA():print('testA')def testB():print('testB')## 导⼊模块的⽂件代码
from my_module1 import *
testA()
testB()
包
包将有联系的模块组织在⼀起,即放到同⼀个⽂件夹下,并且在这个⽂件夹创建⼀个名字为 init.py ⽂件,那么这个⽂件夹就称之为包。
新建包
[New] — [Python Package] — 输⼊包名 — [OK] — 新建功能模块(有联系的模块)。
注意:新建包后,包内部会⾃动创建 init.py ⽂件,这个⽂件控制着包的导⼊⾏为。
- 新建包 mypackage
- 新建包内模块: my_module1 和 my_module2
- 模块内代码如下
# my_module1
print(1)
def info_print1():print('my_module1')
# my_module2
print(2)
def info_print2():print('my_module2')
导⼊包
## import 包名.模块名
## 包名.模块名.⽬标import my_package.my_module1
my_package.my_module1.info_print1()## 必须在 __init__.py ⽂件中添加 __all__ = [] ,控制允许导⼊的模块列表。
from my_package import *
my_module1.info_print1()
达梦支持
有任何问题请到技术社区反馈。
24小时免费服务热线:400 991 6599
达梦技术社区:https://eco.dameng.com
Python对象基础相关推荐
- python 学习笔记day03-python基础、python对象、数字、函数
python基础 语句和语法 注释及续行 首要说明的是:尽管python可读性最好的语言之一,这并不意味者程序员在代码中就可以不写注释 和很多UNIX脚本类似,python注释语句从#字符开始 注释可 ...
- python内建函数测试对象身份_python 学习笔记day03-python基础、python对象、数字、函数...
python基础 语句和语法 注释及续行 首要说明的是:尽管python可读性最好的语言之一,这并不意味者程序员在代码中就可以不写注释 和很多UNIX脚本类似,python注释语句从#字符开始 注释可 ...
- python之⾯向对象基础
python之⾯向对象基础 ⼀. 理解⾯向对象 ⾯向对象是⼀种抽象化的编程思想,很多编程语⾔中都有的⼀种思想. 例如:洗⾐服 思考:⼏种途径可以完成洗⾐服? 答: ⼿洗 和 机洗. ⼿洗:找盆 - 放 ...
- Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合
Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...
- Python - 面对对象(基础)
目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代 ...
- Python基础之day08-面向对象基础3
Python基础之day08-面向对象基础3 文章目录 Python基础之day08-面向对象基础3 一. 二.类方法 三.静态方法 四.总结实例.类.静态方法 代码仓库地址: https://git ...
- Python基础之day06-面向对象基础1
Python基础之day06-面向对象基础1 文章目录 Python基础之day06-面向对象基础1 一.面向对象介绍 二.定义类及创建类对象 三.在类中通过self获取对象属性 四.__init__ ...
- Python基础之day07-面向对象基础2
Python基础之day07-面向对象基础2 文章目录 Python基础之day07-面向对象基础2 一.继承 二.子类调用父类的方法 三.多层继承与多继承 四.多态 五.封装 代码仓库地址: htt ...
- python基本对象_python对象之对象基础1
所有的 Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数 id()来得到. 这个值可以被认为是该对象的内存地址.您极少会 ...
最新文章
- linux命令后面常见的/dev/null 和 21 的含义
- Js的Url中传递中文参数乱码的解决
- 扩展easyui tree的两个方法 获取实心节点
- java环境变量立即生效_win7批处理环境变量立即生效
- javascript / jquery 操作 cookie
- 算法中的算子是什么意思,图像处理一样理解
- CodeProject每日精选: Progress controls 进度条
- Python-03-基础
- ubuntu安装composer
- 轻松解决linux磁盘分配不均问题
- 实例分割和语义分割使用labelme制作的数据集如何转换为voc和coco格式的数据
- L1-043. 阅览室
- linux安装postgresql数据库
- 【牛客网】滴滴出行2017秋招测试岗笔试真题汇总
- 【不务正业】之前端HTML基础(二)
- python中的round函数怎么解释_round函数怎么用_python中round函数怎么用
- MTD/QTD/YTD 去年同期 同比增长——Power BI
- 不定高度的slideUp动画效果
- 群晖中安装Firefly记账软件,使用安卓客户端登录
- 搭建文字转语音(TTS)服务器
热门文章
- nodejs express使用node-xlsx实现文件的上传下载导入导出
- Java黑皮书课后题第10章:*10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数
- java 数字的位数_Java判断数字位数的方法总结
- 第一道java编程题
- 40.QT-QPropertyAnimationdong和QParallelAnimationGroup动画实现
- 解决element-ui的表格设置固定栏后,边框线消失的bug
- 【转载】android权限大全
- windows下使用docker(一)—— 安装
- python脚本批量生成数据
- 老李分享:Android -自动化埋点 2