Python模块,面向对象

Python 模块(module)

import

import module1[, module2[,… moduleN]

  • 在当前路径下搜索模块,如果没有,就在sys.path中的路径搜索。
  • 导入模块后,需要以模块名.函数访问模块中的内容
  • 一个模块只会被导入一次,不管执行了多少次import
import sys
print(sys.path)
['D:\\Code\\Python\\Ali_Python\\语法练习', 'D:\\Code\\Python\\Ali_Python', 'D:\\Code\\Python\\Ali_Python\\venv\\Scripts\\python37.zip', 'D:\\ProgramData\\Anaconda3\\DLLs', 'D:\\ProgramData\\Anaconda3\\lib', 'D:\\ProgramData\\Anaconda3', 'D:\\Code\\Python\\Ali_Python\\venv', 'D:\\Code\\Python\\Ali_Python\\venv\\lib\\site-packages', 'D:\\Code\\Python\\Ali_Python\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg', 'D:\\Code\\Python\\Ali_Python\\venv\\lib\\site-packages\\pip-10.0.1-py3.7.egg']
# Filename: support.py
 
def print_func( par ):
    print ("Hello : ", par)
    return
# 导入模块
import support
 
# 现在可以调用模块里包含的函数了
support.print_func("Runoob")

sys中的ps1和ps2定义了,主提示符和副提示符:

print(sys.ps1)
==> >>> 
print(sys.ps2)
==> ... 

from modulename import name

  • 使用 import 直接把模块内(函数,变量的)名称导入到当前模块,此时modulename在当前模块不起作用。name可以直接使用
  • from modulename import * 导入所有名字,但是以单下划线_不会被导入(不推荐)

__name__(双下划线)

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。参考

__name__ 的值为 __main__ 时,表示当前模块自身在运行

# name_test.py

if __name__ == "__main__":
    print("程序自身在运行")
else:
    print("被别的模块引入,__name__为:", __name__)

>> 自身执行:程序自身在运行
import name_test
>> 被别的模块引入,__name__为: name_test

dir()

dir(module) 列出模块内的所有名称。
dir() 列出当前模块的所有名称

  • 类比:不同模块中的全局变量互不影响。不同包中的模块也互不影响
  • 一个目录只有包含__init__.py文件(可以为空)才会被认为是包。

对于如下包结构:
包结构

导入特定模块(必须使用全名去访问):

import sound.effects.echo
sound.effects.echo.echofilter()

使用from导入模块(可以省去前缀):

from sound.effects import echo
echo.echofilter()

使用from直接导入模块中的函数或者变量:

from sound.effects.echo import echofilter

  • from package import item : item可以是包、模块、函数和变量
  • import item : 先把item当成包,找不到在当成模块。否则就抛出异常
  • import A.B.C : C只能是模块或包,AB都必须是包

从包中导入*

导入语句遵循如下规则:如果包定义文件 init.py 存在一个叫做 __all__ 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。

__all__ = [“echo”, “surround”, “reverse”]

导入包可以遵循目录结构:参考

  • from . import echo : 在当前文件夹effects里导入echo子模块。

  • from .. import formats : 在上一级文件夹sound里的__init__.py程序中导入formats。

  • from ..filters import equalizer : 在上一级文件夹sound下的filters文件夹里的__init__.py程序中导入equalizer子模块。

面向对象

构造函数 __init__()

  • 如果子类没有定义构造函数,则自动调用父类的构造函数
  • 如果子类定义了构造函数,就不会调用父类的构造。但还可以显式的调用父类的构造。
super(子类,self).__init__(参数..)
父类名称.__init__(self,参数1,参数2,...)

类的方法与普通的函数只有一个区别: 第一个参数表示类的实例,按照惯例是self(类似于C++中的this指针),也可以用其他名字

#  python对象
class classTest:
    "This is a Python class"
    def __init__(self):
        print("这是构造函数")
    def fun(self):
        print(self)
        print(self.__class__)
        print(classTest.__doc__)
t = classTest()
t.fun()

###
这是构造函数
<__main__.classTest object at 0x000001AC843D3F60>   # self 表示类的实例
<class '__main__.classTest'> 						# self.__class__ 表示类
This is a Python class								# __doc__类的介绍

继承

Python支持多继承,如果不同的父类中有同名的函数时,按照括号中的顺序从左到右查找父类中的方法。

class DerivedClassName(Base1, Base2, Base3):
	...

方法重写

子类可重写父类的方法,使用super函数可以访问父类中被隐藏的方法。

super(Class[, object])

Python3 和 Python2 的一个区别是: Python3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx

Python3:

class B(A):
    def add(self, x):
        super().add(x)

Python2(Python3也可用):

class B(A):
    def add(self, x):
        super(B, self).add(x)

案例:

class A:
    def add(self, a, b):
        return a + b


class B(A):
    def add(self, a, b):
    #    return super(B, self).add(a, b)
        return super().add(a, b)
tim = B()
print(tim.add(1,2))

属性和方法

私有属性(或方法)使用两个下划线开头 __attribute__method()

关于类变量、成员变量、局部变量。本来很简单的东西在Python里搞得这么复杂。个人理解是:

  • 成员变量一定是以 self.变量名 的形式出现
  • 类变量可以用类名对象来调用
  • Pycharm似乎推荐将所有成员变量写在构造函数中。但是实践中发现也可以在其他位置,但是必须先赋值,后访问(赋值即创建成员变量),否则会报错
  • 函数中的变量必须要赋值后才算创建成功,如果仅是出现变量而不赋值,这个变量依然不存在
  • 不同的对象成员变量可能是不同的。例如b对象,在没有执行fun1()时,就不存在val6,7的成员变量。
class TestClass():
    val1 = 100     	 # 类变量

    def __init__(self):
        self.val2 = 200     # 成员变量
        self.fun()

    def fun(self):
        self.val3 = 300
        val4 = 400			# 局部变量

    def fun1(self, val=400):
        val5 = 500          # 局部变量
        self.val6 = 600		# 成员变量
        self.val7			# 成员变量,必须要赋值,否则这个变量依然不存在

a = TestClass()
a.fun1()		# 删掉后val6,7报错
print(a.val1)
print(a.val2)
print(a.val3)
#print(a.val4)	# 局部变量,报错
#print(a.val5)	# 局部变量,报错
print(a.val6)
print(a.val7)

b = TestClass()
print(b.val6)	# 报错

类的专有方法

  • __init__ : 构造函数,在生成对象时调用
  • __del__ : 析构函数,释放对象时使用
  • __repr__ : 转换为字符串
  • __str__ : 转换为字符串
  • __setitem__ : 按照索引赋值
  • __getitem__: 按照索引获取值
  • __len__ : 获得长度
  • __cmp__ : 比较运算
  • __call__ : 函数调用
  • __add__ : 加运算
  • __sub__ : 减运算
  • __mul__ : 乘运算
  • __truediv__ : 除运算
  • __mod__ : 求余运算
  • __pow__ : 乘方

函数的重载直接重写上面的方法即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值