#%%
# 使用 jupyter notebook 编写
"""
本章知识目录:
1.import搜索的路径顺序
2.Python的封装性
3.Python继承
4.Python多态
"""
"""
考试:
模块的划分、之间的关系
模块导入的方式
import模块时,Python做了什么(了解)
搜索路径顺序
类的初始化的方法(成员的定义)
成员的使用(访问私有变量)
类的继承(子类和父类的关系,初始化的3个情况)
多态(不考,但非常重要)
"""
#%%
"""
import搜索的路径顺序:
1.程序的主目录
2.PYTHONPATH(环境变量)目录
3.标准链接库目录
4.任何.pth文件的内容
这四个组合起来构成了sys.path,其保存了模块搜索路径在机器上的实际配置
搜索路径1(安装目录)和2(\Python\Python35\Lib\site-packages)是系统自定义的,
而2和3可以用于拓展路径,从而加入自己的源代码目录
"""
import sys
print(sys.path)
import site
site.getsitepackages() # 获得包文件的位置
#%%
"""
Python的封装性:
Python的语言风格没有特别强调封装性。
它主张程序员自己通过更加严谨的方式组织程序以避免出错,
而不是通过在语言层面实现封装达到这一点
但是,在Python中仍然可以实现对象的(非严格意义上的)封装
"""
class Student():
def __init__(self, age, sex):
self.__age = age # 在属性或者方法名称前加2个下划线,表示私有化
self.__sex = sex
LTL = Student(19, 'Man')
#print(LTL.__age) # 这是会报错的
print(LTL._Student__age) # 这是可以的,通过 _类名+私有变量
#%%
"""
Python继承:
1.子类中的__int__()方法 (以下三点总结了所有的情况)
如果子类没有定义自己的初始化函数,父类的初始化函数会被默认调用;但是如果要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。
如果子类定义了自己的初始化函数,而在子类中没有显式调用父类的初始化函数,则父类的属性不会被初始化
如果子类定义了自己的初始化函数,在子类中显式调用父类,子类和父类的属性都会被初始化
"""
# 子类没有定义自己的初始化函数
class Parent(object):
def __init__(self, name):
self.name = name
print("create an instance of:", self.__class__.__name__)
print("name attribute is:" , self.name)
class Child(Parent):
pass
#c = Child() # 这样是不行的,会报错
c = Child("son") # 这样是可以的
print('=============================')
# 子类定义了自己的初始化函数,但没有显式调用父类构造函数
class Girl(Parent):
def __init__(self):
print("call __init__ from Child class")
c = Girl() # 可以,但父类的属性没有初始化
#print(c.name) # 会报错
print('=============================')
# 子类定义了自己的初始化函数,而且显式调用了父类构造函数
# 这个super放在__init__()中的哪里都行,哪怕在__init__()中有多个都行
class Child(Parent):
def __init__(self, sex):
#super(Child, self).__init__("data from Child")
self.sex = sex
#super(Child, self).__init__("data from Child")
#def sd(self):
#super(Child, self).__init__("data from Child")
c = Child('Man')
#c.sd() # 这可以,不过在创建对象时不会初始化
#%%
# Python多态:
class A():
def fa(self):
print('from A')
def test(self):
self.fa()
class B(A):
def fa(self):
print('from B')
b = B()
b.test() # 子类会覆盖父类的方法
#%%
class A():
def __fa(self): # 父类将方法定义为私有
print('from A')
def test(self):
self.__fa()
class B(A):
def __fa(self):
print('from B')
#def _A__fa(self):
#print("Yes") # 但如过加上这个方法,那么下面的b.test()会调用此方法,输出Yes
b = B()
b.test() # 子类方法不能覆盖父类方法
山东大学Python(6)——模块
猜你喜欢
转载自blog.csdn.net/weixin_43360801/article/details/103318037
今日推荐
周排行