主要内容:
- 类和实例
- 模块的使用
- 包的使用
一、类和实例
- 类和实例的定义
- 类的创建
- 类的继承
- 类中的方法
- 类的使用
定义
类(class)是拥有相同属性和行为的抽象原型,而实例是根据类创建出来的具体对象,每个对象拥有相同的函数方法,数据不同。
类的创建
格式:class 类名():
class Animal():
类的继承
格式:class 子类类名(父类类名[,父类类名2[,....): 。子类可以继承父类的属性和方法
class Dog(Animal):
类中的方法
class Animal():
def __init__(self,name,shouts,food,className):#初始化方法 self不是关键字,代表当前实例,在实例化的时候自动执行
#声明属性
self.name=name #通过self 创建实例属性并赋值
self.shouts=shouts
self.food=food
Animal.className=className #类属性
#self.__name=name #私有属性
def shout(self):
print("%s的叫声是%s,吃的食物是%s"%(self.name,self.shouts,self.food))
__init__()是初始化方法(构造方法),在类被调用时,这个方法会自动执行。其中参数“self”指的是实例本身,实例化时,会自动将实例本身通过self传进去。
另:为了确保内部属性不被外部随意修改,可以在属性名前加入双下划线(eg:self.__name=name),这样就变成了私有属性,不被外部访问。若是外部要修改或访问,可以创建一个方法返回
def get_name(self): #获取私有属性值
return self.__name
def set_name(self,name): #修改私有属性值
return self.__name=name
继承父类中的构造方法
class Dog(Animal):
def __init__(self,name,shouts,food,className,drink):
#加载父类的构造方法
super().__init__(name,shouts,food,className)
self.drink=drink
在继承父类的子类构造方法中实现父类的构造方法,使用super().__init__(父类参数)
普通方法
def virtual(self):
print("喵喵叫")
静态方法(它不需要传入self参数,也不能访问实例属性,而只能访问类属性)
@staticmethod
class a():
ts='类属性'
def __init__(self,s):
self.s=s
def staticMethod(data): #这里不要传递self
print(data,a.ts) #只能访问类属性
#静态方法调用方式,可以通过类名.静态方法名 或是 实例对象.静态方法
#类名.静态方法
a.staticMethod('静态方法')
#实例对象.静态方法
aObject=a('实例属性')
aObject.staticMethod('静态方法')
类方法(它不能访问实例属性,只能访问类属性)
@classmethod
class a():
ts='ce'
def __init__(self,s):
self.s=s
def classMethod(cls,data): #这里的cls指的是类(class)
print(data,cls.ts)
#类方法调用方式,可以通过类名.类方法名 或是 实例对象.类方法名
#通过类名.类方法名 (推荐方式)
a.classMethod(1)
#通过实例对象.类方法名
aObject=a('t')
aObject.classMethod(1)
类的使用
变量名=类名(参数[,.......)
二、模块的使用
1.导入方式
导入整个模块:import 模块名[,模块名[,....
import time #引入模块
print("start")
time.sleep(5) #调用模块中的方法
print("end")
导入指定模块的指定方法:from 模块名 import 方法名 (当方法名是 *星号,表示导入模块的所有内容)
from time import sleep #引入模块中的部分方法
print("start")
sleep(5) #调用方法
print("end")
给导入的模块取别名:import 模块名 as 别名
import time as t #给模块取别名
t.sleep(5) #调用方法
2.自定义模块
#test文件
def test_add(x,y):
return x+y
当test文件与main文件在同级目录下时,调用方法:
#main文件
import test #引入test模块
print(test.test_add(3,5)) #调用test模块中的方法
当test文件在main文件的同级子目录中时,调用方法:
#main文件
import 子目录名称.test
print(子目录名称.test.test_add(5,3))
'''
或者
from 子目录名 import test
print(test.test_add(5,2))
'''
当test文件在main文件的父级目录的同级目录中时,调用方法:
#main文件
import sys
#添加目标目录到当前环境中
sys.path.append('..\\') #返回上级目录
import main父类目录的同级目录名.test #引入模块
print(main父级目录的同级目录名.test.test_add(5,2)) #调用方法
'''
或者
from main父级目录的同级目录名 import test
print(test.test_add(5,2))
'''
另外:dir方法 用于按模块名搜索模块定义,它返回的是包含所有类型名称(类,变量,方法等)的字符串类型的列表 如:dir(模块名)
三、包的使用
一个目录中除了有模块文件,并包含有__init__.py文件,才能被程序认为是一个包。__init__.py文件中必须要写入 __all__=["模块名",“模块名2”,.......]。如果__init__.py文件内容为空,仅仅是把这个包导入,包内的模块并未被导入。__all__变量可以用来控制 from 包名 import * 时导入的模块。
#包名:study (也就是一个文件夹)
#模块:A B C (也就是文件夹中的文件)
#__init__.py 文件
__all__=['A','B','C'] #列表中的元素是 允许被导入的模块名称
#main 文件
import sys
sys.path.append('..\\')
from study import *
A.method('A')
B.method('B')
C.method('C')
重新加载
import A
#import A #引入2次只输出一次,这是因为模块在第一次引入的之后,其他导入就不再有效。
import imp
imp.reload(A) #重新加载A