山东大学Python(6)——模块

#%%
# 使用 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() # 子类方法不能覆盖父类方法
发布了36 篇原创文章 · 获赞 20 · 访问量 2924

猜你喜欢

转载自blog.csdn.net/weixin_43360801/article/details/103318037