Python遗漏知识记录
Python摘录
摘录自:Python核心知识系列:Python工程组织结构
1. import 只能引入模块,不能直接引入变量或函数。
import package1.module1 import package1.module2 as pm2 # 多层调用太长,可以重命名 print(package1.module1.var1) print(pm2.num1) # 输出 Python 1
2. from... import 可以导入模块、变量或函数。
from package1 import module1 from package1 import module2 print(module1.var2) print(module2.num2) # 输出 Go 2
from package1.module1 import var3 # 导入变量或函数 print(var3) # 输出 Java
from package1.module1 import var3 print(var3) # 输出 Java
3. 在module2.py模块中定义了__all__=['num1', 'num2'],则导入模块module2.py时只可导入num1, num2,其他内容不可见。
__all__属性仅在使用import *时才有效。
4. 导入模块换行
# 使用 \ from package1.module2 import num1, \ num2, num3 # 使用(),推荐这种方式 from package1.module2 import (num1, num2, num3)
5. 包和模块不会重复导入:在导入一个模块的时候,就会执行这个模块里的所有内容,但是多次导入只执行一次。
6. 导入模块时,默认情况下python解析器会搜索当前目录、已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中。sys.path返回一个列表,
使用sys.path.append(' ')添加自定义的搜索目录。
7. _init_.py的用法
- 用来标识该文件夹是一个包。
- 导入包或包下的模块时,
__init__.py文件被自动执行。 __init__.py文件中也可以利用__all__来限制导入的模块。- 如果在项目中有模块是多个文件共用的,可以把这些模块在
__init__.py导入
8. Python不需要显式提供 main() 函数入口。在Python文件中,__name__ == '__main__'被用于定义入口文件。这些文件既可以作为模块被导入,也可以执行。如果文件作为模块被导入,__name__被赋值模块的名字。当文件执行被执行时,__name__为__main__。
if __name__ == '__main__': pass
摘录自:Python项目组织结构-第二节:模块内置变量
1. 在Python中变量有两类,一类由用户定义,另一类叫做内置变量,调用dir()函数会返回一个列表,里面包含了所有内置变量和所有自定义变量。内置变量会以__[]__的形式命名。
2. Python中模块被导入时其中的语句是会自动执行的,因此这就产生了一个问题——如何区分这个模块是直接被执行的还是说它是被导入后才被执行?
因此,在Python中就会有如下非常经典的语句:
if __name__ == '__main__' print("这是入口文件") else print("这是导入")
3. 一般来说,常规的Python项目组织结构如下,其中main.py作为入口文件。在上面展示的目录结构中,模块最顶级的包并不是Python study,而是由入口文件决定的,和入口文件平级的就是顶级包。

4. 绝对导入和相对导入
绝对导入: 从顶级包开始逐级寻找模块的导入方式,要判别清楚哪一个才是真正的顶级包。
import module1.p1
相对导入: 和相对路径类似,用.代表当前目录、用..代表上一级目录
5. 不同的包下面可以有相同名字的模块,区别他们时使用“包名.模块名”
6. 只要文件目录下,包含_init_.py这个空文件,Python解释器就会认为这个目录是一个包,这就是包和文件夹的显著区别。包被导入的时候,__init__.py会自动执行
7. 模块被导入时模块里面的语句是会被执行的
面向对象
都是精华,很妙,就不整理了hhh
_函数自带方法例子_
class Cat: def __init__(self,new_name): self.name =new_name print("%s 来了"%self.name) def __del__(self): print("%s 我去了"%self.name) def __str__(self): #必须返回一个字符串 return "我是小猫[%s]" %self.name #tom是一个全局变量 tom =Cat("Tom") print(tom)
大全
1. self
哪一个对象调用方法,方法内的self就是哪一个对象的引用
在类封装的方法内部,self就表示当调用方法的对象自己
在调用方法时,开发用户不需要传递self参数。
在方法内部可以通过self. 访问对象属性
也可以通过self. 调用其他的对象方法。
2. 对象的初始化方法:
当使用类名创建对象时,会自动执行以下操作:
为对象分配空间 为对象的属性设置初始值,初始化方法 __init__(), __init__是对象的内置方法,专门用来定义一个类具有哪些属性。
class Cat: def __init__(self): print("这是一个初始化方法") #使用类名()创建对象的时候,会自动调用初始化方法__init__ tom =Cat()
3. 定义属性的时候,如果不知道设置什么初始值,可以设置为None
- None关键字表示什么都没有
- 表示一个空对象,没有方法和属性,是一个特殊的变量
- 可以将None赋值给任何一个变量
4. is 与==区别:
- is用于判断两个变量引用对象是否为同一个
- ==用于判断引用变量的值是否相等
5. 私有属性和私有方法
- 应用场景及定义方式,在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部访问到。
- 定义方法: 在定义属性或方法时,在属性名或方法名前增加两个下划线,定义就是私有属性或方法。
class Women: def __init__(self,name): self.name =name self.__age =18 def secret(self): #在对象的方法内部是可以访问对象的私有属性的 print("%s的年龄是%d"%(self.name,self.__age)) xiaofang =Women("小芳") print(xiaofang.name) #私有属性,在外界不能够被访问,但是在内部是可以访问的 #方法也一样 __secret(self): 同样在外部不允许访问 # print(xiaofang.__age) xiaofang.secret()
6. 面向对象的三大特性: 封装 继承 多态
- 封装:根据职责将属性和方法封装到一个抽象的类中.
- 继承:实现代码的重用 相同的代码不需要重复的编写。继承的概念:子类拥有父类的全部方法和属性
- 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度。
7. 重写:重新定义一个重名的函数,直接覆盖掉。
重写后还要调用父类的原方法时,使用super.父类的方法().
8. 多继承,子类拥有一个父类被称为单继承,但是子类可以拥有多个父类。存在同名的方法时应当注意避免多继承
class 子类名(父类名1,父类名2.....) pass
python的MRO --方法搜索顺序(可以搜索一下哪个优先调用)
class A: def test(self): print("test 方法") class B: def demo(self): print("demo方法") class C(A,B): """多继承可以让子类对象同时具有多个父类的属性和方法""" pass #创建一个子类对象 c =C() c.test() c.demo() print(c.__mro__)
9. 多态:不同的子类对象调用相同的父类方法,产生不同的执行结果
- 多态可以增加代码的灵活度
- 以继承和重写父类方法为前提
- 是调用方法的技巧,不会影响到类的内部设计
class Dog(object): def __init__(self,name): self.name =name def game(self): print("%s 蹦蹦跳跳的玩耍"%self.name) class xiaotianquan(Dog): def game(self): print("%s 飞到天上去玩耍..."%self.name) class Person(object): def __init__(self,name): self.name =name def game_with_dog(self,dog): print("%s 和%s快乐的玩耍"%(self.name,dog.name)) #让狗玩耍 dog.game() #1.创建一个狗对象 # wangcai =Dog("旺财") wangcai =xiaotianquan("飞天旺财") #2.创建一个小明对象 xiaoming =Person("小明") #3. 让小明调用狗玩的方法 xiaoming.game_with_dog(wangcai)
10. 类是一个特殊的对象。类属性:
- 类属性是类对象中定义的属性
- 通常用来记录与这个类相关的特征
- 类属性不会用于记录具体对象的特征
class Tool(object): #使用赋值语句,定义类属性,记录创建工具对象的总数 count =0 def __init__(self,name): self.name =name #让类属性的值+1 Tool.count +=1 #1.创建工具对象 tool1 =Tool("斧头") tool2 =Tool("榔头") #2. 输出工具对象的总数 print(Tool.count)
属性获取机制: python中属性的获取存在一个向上查找的机制
tool1.count
- 首先在对象内部 查找对象属性
- 没有找到就会向上寻找类属性
如果使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会用想到类属性的值
11. 类方法和静态方法
类方法:使用修饰器 @classmethod来进行标识,告诉解释器这是一个类方法,类方法的第一个参数应该是cls。
@classmethod def 类方法名(cls): pass
- 由哪一个类调用的方法,方法内的cls就是哪一个类的引用
- 这个参数和示例方法的第一个参数是self类似
- 提示,使用其他名称也可以,不过习惯用cls
通过对类名 调用类方法 调用方法时,不需要传递cls参数。在方法内部,也可以通过cls访问类的属性,也可以通过cls调用其他类的方法。
class Tool(object): count =0 @classmethod def show_tool_count(cls): print("工具对象的数量%d"%cls.count) def __init__(self,name): self.name =name #让类属性的值+1 Tool.count +=1 #创建工具对象 tool1 =Tool("斧头") tool2 =Tool("锄头") #调用类方法 Tool.show_tool_count()
静态方法:不需要访问实例属性和类属性,需要加上@staticmethod关键字。
class Dog(object): @staticmethod def run(): #不访问实例属性/类属性 print("小狗要跑。。。。") #通过类名.调用静态方法 #不需要创建对象,可以直接用 Dog.run()
12. 单例设计模式
单例设计模式 让类创建对象,在系统中只有唯一的一个实例,每一次执行 类名() 返回的对象,内存地址是相同的
__new__方法是一个由object基类提供的内置的静态方法,为对象分配空间,返回对象引用
__init__方法是初始化,定义实例属性
重写 __new__方法的代码非常固定,一定要 return super().__new__(cls),否则 __new__是一个静态方法,在调用是需要注意注定传递cls参数。
class MusicPlayer(object): def __new__(cls, *args, **kwargs): #1.创建对象时,new方法会被自动调用 print("创建方法。分配空间") #2.为对象分配空间 result = super().__new__(cls) #3.返回对象的引用 return result def __init__(self): print("播放器初始化") #创建播放器对象 play =MusicPlayer() print(play)
class MusicPlayer(object): #记录第一个被创建的对象的引用 instance =None def __new__(cls, *args, **kwargs): #1.创建类属性是否为空对象 if cls.instance is None: #2.调用父类的方法,为第一个对象分配空间 cls.instance =super().__new__(cls) return cls.instance play1 =MusicPlayer() print(play1) play2 =MusicPlayer() print(play2)
class A: def test(self): print("test 方法") class B: def demo(self): print("demo方法") class C(A,B): """多继承可以让子类对象同时具有多个父类的属性和方法""" pass #创建一个子类对象 c =C() c.test() c.demo() print(c.

浙公网安备 33010602011771号