Python遗漏知识记录

Python摘录


 

摘录自:Python核心知识系列:Python工程组织结构

1.  import 只能引入模块,不能直接引入变量或函数。

 import package1.module1
 import package1.module2 as pm2   # 多层调用太长,可以重命名
print(package1.module1.var1)
 print(pm2.num1)
 # 输出
 Python
 1
View Code

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)
View Code

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("这是导入")
View Code

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)
View Code

 

大全

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.
posted @ 2022-10-18 00:17  是余是我  阅读(31)  评论(0)    收藏  举报