# 继承
# 假设有一个类,能够实现我们需要的大部分功能,但是不能实现全部功能,那么如何实现全部功能呢?
# 1.如果直接在这个类中添加我们需要的功能,修改起来会很麻烦
# 2.如果创建一个新类来实现全部功能,就会有很多重复劳动的工作。
# 3.创建一个父类,来继承这个父类的属性和方法。
# 继承是面向对象的三大特性之一,通过继承我们可以使一个类获取到其他类中的属性和方法,
# 在定义类可以在类名后的括号中指定当前类的父类从而继承父类中的所有属性和方法。
class Animal:
def __init__(self,name):
self._name = name
def run(self):
print('animal run')
def eat(self):
print('eat')
# 使用当前类调用方法时,会先在调用类中查找是都有该方法如果调用的方法类中没有,
# 就会去该类的父类中查找,知道找到调用的方法。
class Dog(Animal):
def __init__(self,name,age):
# 通过调用父类的初始化方法来继承父类中的属性
# Animal.__init__(self,name)
# super()可以动态获取父类
super().__init__(name)
self._age = age
# 子类和父类中有相同方法时会有限调用子类中的方法
def run(self):
print('dog run')
def jump(self):
print('jump')
@property
def name(self):
return self._name
@property
def age(self):
return self._age
a = Animal('ad')
d = Dog('jack',12)
d.jump()
d.run()
a.run()
print(d.name,d.age)
# d是否是dog,animal的实例
print(isinstance(d,Dog))
print(isinstance(d,Animal))
# 判断dog是否是animal的子类
print(issubclass(Dog,Animal))
# object是所有的类的父类
print(issubclass(Animal,object))
# 垃圾回收
# 在程序运行过程好着呢产生的垃圾会影响到程序的运行性能,所以这些垃圾需要被清理
# 在程序中没有被引用的对象就是垃圾,这些对象需要从内存中删除。
# python中有自动的垃圾回收机制,会将这些没有被引用的对象删除,所以在程序过程中不需要我们手动删除。
class A(object):
def __init__(self):
self.name = 'A'
def __del__(self):
print('删除了',self)
a = A()
print(a.name)
# 特殊方法,都是使用__开头和结尾的
# 特殊方法一般不需要手动调用,需要在特殊情况下自动执行
class Person(object):
def __init__(self, name,age):
self._name = name
self._age = age
# 用来将指定对象转换为字符串结果
def __str__(self):
return 'person [name = %s , age = %d]'%(self._name,self._age)
# 该方法会在当前对象调用repr()函数时调用
# 作用是指定对象在交互模式中直接输出的效果
def __repr__(self):
return 'hello'
p = Person('jack',12)
print(p)
# 模块化,是指将一个完整的程序分解为一个一个小的模块
# 通过将模块组合来搭建出一个完整的程序。
# 采用模块化的优点:
# 方便开发维护
# 模块可以被复用
# 在python中一个py文件就是一个模块,模块名的定义要符合标识符的规范
# 在一个模块中导入另一个模块
# 1. import 模块名,如果重复引用只会创建一个实例,一般都是在文件的开头统一引入模块。
# import module as m
# 2. import 模块名 as 别名
# 每一个模块内部都有一个__name__属性,通过这个属性可以获取模块的名称
# __name__属性的名称为__main__的是主模块,一个程序中只会有一个主模块
# 主模块就是直接通过python执行的模块
import module as m
print(m.a,m.b) # 获取模块中定义的变量
m.test()
# 也可以只引入模块中的部分内容
# 语法 from 模块名 import 变量...
# from 模块名 import * 是引入模块中所有内容
from module import test
# 为引入的变量定义别名
from module import test as new_test
test()
new_test()
# 包,也是一个模块,当模块中代码过或者一个模块需要被分解成多个模块时就需要包。
# 模块是指一个py文件夹,而包是一个文件夹,文件夹中有多个py文件。
# 包中必须有一个__init__.py文件,该文件可以包含包中的主要内容
# 代码编译后包中会自动产生一个_pycache_文件夹,这是模块的缓存文件
# py代码在执行前,需要被解析器先转换为机器码,然后在执行
# 所以在使用模块时,需要将模块先转为机器码在去执行
# 为了提高程序运行的性能,python在编译一次后,会将代码保存在1一个缓存文件中。
# 这样在下次加载这个模块的时候就不用再重新编译而是直接加载缓存文件中的代码。
# python标准库,开箱即用
# sys模块,提供一些变量和函数,使我们可以获取python解析器的信息
import sys
# 获取执行代码时命令行中输入的参数,返回结果是一个列表
print(sys.argv)
# 获取当前模块中引入的所有模块返回结果是一个字典,key是模块名value是模块对象
print(sys.modules)
# 返回结果是模块的搜索路径
print(sys.path)
# 当前python运行的环境
print(sys.platform)
import os
# 获取系统的环境变量
print(os.environ['path'])
# 获取系统的名字
print(os.system('dir'))
# 异常,程序在运行过程中,不可避免出现的一些错误,这些错误就是异常。
# 当异常发生时会导致程序立即停止,后面的代码就无法正常执行。
# 程序出现异常后,所有的异常信息会被保存在一个专门的异常对象中。
# 处理异常语法
# try:
# 可能会出现异常的代码块
# except:
# 出错后的处理内容
# else:
# 没有出错执行的代码
# 语法要求:try代码块是必须的,else可有可无,except和finally至少有一个
# 自定义异常
# 只需要继承Exception
class myError(Exception):
pass
try:
print(10/0)
# except : 该写法会捕获所有的异常
# except 异常类型:只会捕获对应类型的异常
except ZeroDivisionError as z:
print('ZeroDivisionError error',z)
# raise myError('123')
# Exception是所有异常类的父类
except Exception as e:
print('error',e)
# 向调用处抛出异常
raise Exception('数字错误')
else:
print('normal')
finally:
print('always execute')