python基础学习2--模块、面向对象编程

文章介绍了Python中的模块和包的概念,如何通过目录结构避免模块冲突,以及__init__.py的作用。同时,文章深入讲解了面向对象编程的基础,包括类的定义、实例化、初始化方法__init__、访问限制、继承和多态。特别提到了Python中的“鸭子类型”思想,并讨论了实例属性和类属性的区别与注意事项。
摘要由CSDN通过智能技术生成

一、模块
在python中,一个.py文件就称之为一个模块(module)。为了避免模块重名冲突,pyton又引入了按目录来组织模块的方法,成为包(package)。
比如mycompany,按照如下目录存放:
在这里插入图片描述
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名是company。
注意:创建模块时要注意命名,不能和Python自带的模块名称冲突。

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用。类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。

二、面向对象编程(OOP,Objected Oriented Programming)
在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。
面向对象最重要的概念就是类(Class)和实例(Instance)。
(1)定义
在Python中,定义类是通过class关键字:
在这里插入图片描述
class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
创建实例是通过类名+()实现的:
在这里插入图片描述
可以看到,变量bart指向的就是一个Student的实例,后面的0x10a67a590是内存地址,每个object的地址都不一样,而Student本身则是一个类。
通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去:
在这里插入图片描述
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
在这里插入图片描述
(2)访问限制
属性的名称前加上两个下划线__,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
在这里插入图片描述
需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
(3)继承和多态
继承:上面已经提到过,子类定义时将父类写在类名后的括号里。例如:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
多态:用示例来理解多态,对上例中的Dog类和Cat类进行完善,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意:Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了。这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
(4)示例属性和类属性
在__init__()中给实例绑定属性的方法是通过实例变量,或者通过self变量。直接在class中定义属性,这种属性是类属性,归Student类所有:
在这里插入图片描述
当我们定义了一个类属性后,这个属性虽然归类所有,但类的所有实例都可以访问到。在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值