Python2中类分为:经典类 和 新式类
-
创建类:
类名要满⾜标识符命名规则,同时遵循⼤驼峰命名习惯。
class 类名():
代码
......
-
创建对象:对象名 = 类名()
self指的是调⽤该函数的对象相当于java中的this
-
类外面添加对象属性的值:对象名.属性名 = 值
one.name='Tom'
-
类外面获取属性的值:值=对象名.属性
print(haier1.width)
-
类里面获取对象属性:self.属性名
class Washer():
# 定义初始化功能的函数 # 添加实例属性
def __init__(self):
self.width = 500
self.height = 800
__init__():构造函数即初始化
在Python中, __xx__() 的函数叫做魔法⽅法,指的是具有特殊功能的函数。
-
__init__() ⽅法的作⽤:初始化对象。
-
__init__() ⽅法,在创建⼀个对象时默认被调⽤,不需要⼿动调⽤
-
__init__(self) 中的self参数,不需要开发者传递,python解释器会⾃动把当前的对象引
-
⽤传递过去。
class Washer():
# 定义初始化功能的函数 # 添加实例属性
def __init__(self):
self.width = 500
self.height = 800
def print_info(self):
# 类⾥⾯调⽤实例属性
print(f'洗⾐机的宽度是{self.width}, ⾼度是{self.height}')
haier1 = Washer()
haier1.print_info()
-
带参数的__init__():
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
__str__():输出对象
-
当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 __str__ ⽅法,那么就会打印从在这个⽅法中 return 的数据
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def __str__(self):
return '这是海尔洗⾐机的说明书'
haier1 = Washer(10, 20)
print(haier1)
__del__():删除
-
当删除对象时,python解释器也会默认调⽤ __del__() ⽅法。
class Washer():
def __init__(self, width, height):
self.width = width
self.height = height
def __del__(self):
print(f'{self}对象已经被删除')
haier1 = Washer(10, 20)
del haier1
# <__main__.Washer object at 0x0000026118223278>对象已经被删除
⾯向对象三⼤特性
-
封装
将属性和⽅法书写到类的⾥⾯的操作即为封装
封装可以为属性和⽅法添加私有权限
-
继承
⼦类默认继承⽗类的所有属性和⽅法
⼦类可以重写⽗类属性和⽅法
-
多态
传⼊不同的对象,产⽣不同的结果
多态:多态指的是⼀类事物有多种形态,(⼀个抽象类有多个⼦类,因⽽多态的概念依赖于继承)。
-
定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果
class Dog(object):
defwork(self): # ⽗类提供统⼀的⽅法,哪怕是空⽅法
print('父类方法')
class ArmyDog(Dog): # 继承Dog类
defwork(self): # ⼦类重写⽗类同名⽅法
print('子类方法')
class Person(object):
def work_with_dog(self, dog): # 传⼊不同的对象,执⾏不同的代码,即不同的work函数
dog.work()
ad = ArmyDog() #创建子类对象
daqiu = Person()
daqiu.work_with_dog(ad)
类属性:
-
类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有。
类属性可以使⽤ 类对象 或 实例对象 访问。
类的实例 记录的某项数据 始终保持⼀致时,则定义类属性。
实例属性 要求 每个对象 为其 单独开辟⼀份内存空间 来记录数据,⽽ 类属性 为全类所共有,仅占⽤⼀份内存,更加节省内存空间。
-
类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。
class Dog(object):
tooth = 10 #类属性
Dog.tooth = 12 #通过类对象修改
wangcai = Dog() #报错,不能通过实例对象修改
wangcai.tooth = 20
实例属性:
-
实例属性不能通过类对象修改,只能通过实例对象修改。
class Dog(object):
def __init__(self): #实例属性
self.age = 5
def info_print(self):
print(self.age)
wangcai = Dog()
print(wangcai.age) # 5
# print(Dog.age) # 报错:实例属性不能通过类访问
类⽅法和静态⽅法
-
类方法:@classmethod
-
第⼀个形参是类对象的⽅法
-
需要⽤装饰器 @classmethod 来标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以cls 作为第⼀个参数。
class Dog(object):
__tooth = 10
@classmethod
def get_tooth(cls):
return cls.__tooth
wangcai = Dog()
result = wangcai.get_tooth()
print(result) # 10
-
静态方法 @staticmethod
-
需要通过装饰器 @staticmethod 来进⾏修饰,静态⽅法既不需要传递类对象也不需要传递实例对象
-
(形参没有self/cls)。
-
静态⽅法 也能够通过 实例对象 和 类对象 去访问。
-
静态⽅法使⽤场景
当⽅法中 既不需要使⽤实例对象(如实例对象,实例属性),也不需要使⽤类对象 (如类属性、类⽅法、创建实例等)时,定义静态⽅法
取消不需要的参数传递,有利于 减少不必要的内存占⽤和性能消耗
class Dog(object):
@staticmethod
def info_print():
print('这是⼀个狗类,⽤于创建狗实例....')
wangcai = Dog()
# 静态⽅法既可以使⽤对象访问⼜可以使⽤类访问
wangcai.info_print()
Dog.info_print()
继承:
pass 是一个空语句,它在Python中是一个占位符,不执行任何操作。它通常用于在语法上需要语句
#单继承
class Prentice(Master):
#多继承
class Prentice(School, Master):
pass
-
super()调⽤⽗类⽅法
异常
try:
可能发⽣错误的代码
except:
如果出现异常执⾏的代码
1. 如果尝试执⾏的代码的异常类型和要捕获的异常类型不⼀致,则⽆法捕获异常。
2. ⼀般try下⽅只放⼀⾏尝试执⾏的代码。
try:
print(1/0)
except (NameError, ZeroDivisionError):
print('有错误')
-
NameError:当试图访问一个未定义的变量时,会引发 NameError。在这种情况下,except 语句将捕获该异常并执行相应的代码块。
-
ZeroDivisionError:当试图在除法运算中除以零时,会引发 ZeroDivisionError。同样地,except 语句将捕获该异常
捕获所有异常:Exception是所有程序异常类的⽗类
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:
可能出现错误的代码
except Exception as result:
出现错误后,执行的代码。
else:
没有出现错误,执行的代码。
finally:
⽆论是否异常都要执⾏的代码。
异常的传递
在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
# 1. ⾃定义异常类
class 异常类类名(Exception):
代码
# 设置抛出异常的描述信息
def __str__(self):
return ...
# 2. 抛出异常
raise 异常类名()
# 捕获异常
except Exception..
模块和包
模块制定:
在Python中,每个Python⽂件都可以作为⼀个模块,模块的名字就是⽂件的名字。
也就是说⾃定义模块名必须要符合标识符命名规则。
import 模块名
from 模块名 import 功能名
from 模块名 import *
import 模块名 as 别名
from 模块名 import 功能名 as 别名
# 1. 导⼊模块
import 模块名
import 模块名1, 模块名2...
# 2. 调⽤功能
模块名.功能名()
import math
print(math.sqrt(9)) # 3.0
from 模块名 import 功能1, 功能2, 功能3...
from math import sqrt
print(sqrt(9))
from 模块名 import *
from math import *
print(sqrt(9))
# 模块定义别名
import 模块名 as 别名
# 功能定义别名
from 模块名 import 功能 as 别名
# 模块别名
import time as tt
tt.sleep(2)
print('hello')
# 功能别名
from time import sleep as sl
sl(2)
print('hello')
如果使⽤ from .. import .. 或 from .. import * 导⼊多个模块的时候,且模块内有同名功能。当调
⽤这个同名功能的时候,调⽤到的是后⾯导⼊的模块的功能。
模块定位顺序
当导⼊⼀个模块,Python解析器对模块位置的搜索顺序是:
1. 当前⽬录
2. 如果不在当前⽬录,Python则搜索在shell变量PYTHONPATH下的每个⽬录。
3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径⼀般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中。变量⾥包含当前⽬录,PYTHONPATH和由安装过
程决定的默认⽬录。
注意
⾃⼰的⽂件名不要和已有模块名重复,否则导致模块功能⽆法使⽤
使⽤from 模块名 import 功能 的时候,如果功能名字重复,调⽤到的是最后定义或导⼊的功
能。
如果⼀个模块⽂件中有 __all__ 变量,当使⽤ from xxx import * 导⼊时,只能导⼊这个列表中的元素。
module1.py模块:
__all__ = ['testA','testB']
def testA():
print('testA')
def testB():
print('testB')
导⼊模块的⽂件代码
from module1 import *
testA()
testB()
包:
包将有联系的模块组织在⼀起,即放到同⼀个⽂件夹下,并且在这个⽂件夹创建⼀个名字为 __init__.py ⽂件,那么这个⽂件夹就称之为包。
制作包:
[New] — [Python Package] — 输⼊包名 — [OK] — 新建功能模块(有联系的模块)。
新建包后,包内部会⾃动创建 __init__.py ⽂件,这个⽂件控制着包的导⼊⾏为。


导包:包名.模块名.⽬标
import 包名.模块名
导包:必须在 __init__.py ⽂件中添加 __all__ = [] ,控制允许导⼊的模块列表。
from 包名 import *
模块名.⽬标
总结:
导⼊模块⽅法
import 模块名
from 模块名 import ⽬标
from 模块名 import *
导⼊包
import 包名.模块名
from 包名 import *
__all__ = [] :允许导⼊的模块或功能列表
1388

被折叠的 条评论
为什么被折叠?



