美文网首页
Python编程:从入门到实践 Day9

Python编程:从入门到实践 Day9

作者: 欠欠的小跟班 | 来源:发表于2018-04-29 22:51 被阅读0次

    学到“类”这一章的时候,应该算是真正接触面向对象编程了,与之前的流程化的完全不一样了,所以学得稍显吃力,有些没写清楚或写错的请及时指正。

    第九章 类

    1.创建和使用类

    个人理解,类就是把现实中的一些对象的属性和功能进行抽象。
    比如:
    把人作为对象,每个人都有姓名、年龄、性别、身高、体重等信息,
    这些可以归纳作为属性。
    每个人都会坐、站、躺、走等,
    这些可以归纳为方法。
    方法和属性的区别,个人理解为:
    因为方法不是一个变量能表示,而是一些行为,
    而属性是简单的信息,能够直接用一段文字或者几个数字表示。

    (1)创建类

    class 类名():
    *:类名通常首字母大写。
    

    (2)__init __()方法:类里面的第一个方法

    每当利用类创建实例时,这个方法都会自动运行。

    def __init__(self,para_1,para_2):
        self.para_1 = para_1
        self.para_2 = para_2
    *:1.init前后均为2个下划线!2个下划线!2个下划线!
      2.第一个形参代表了这个类,可以是self,也可以是其他名字。
      3.代码块中的两句话,相当于在类实例化时,将传递过来的实参传给了属性。
      4.以self为前缀的变量可以给类中所有的方法使用。
        可以理解为,以self为前缀的变量就是属性,属性可以在类中任何地方使用。
      5.定义其他方法的时候,通常都将self作为参数。相当于确保所有方法都能使用属性。
    

    (3)根据类创建实例

    定义了一个类以后,可使用以下语句来创建实例。也就是根据类生成对象。

    实例名 = 类名(实参)
    *:1.实例的名称通常使用小写,方便地与类名相区分;
      2.访问属性或调用方法时,使用句点(.)
        即:            类名.属性名   and   类名.方法
    

    小例子

    class People():
        '''尝试对人进行简单的抽象。'''
        def __init__(self,name,sex,age):
            '''初始化姓名、性别和年龄'''
            self.name = name
            self.sex = sex
            self.age = age
        def sit(self):
            '''模拟人会坐下'''
            print(self.name.title() + 'is sitting!')
    
    
    #实例化一个人
    zhangsan = People('zhangsan','man','18')
    #访问实例的属性
    print('My name is ' + zhangsan.name)
    #调用实例的方法
    zhangsan.sit()
    

    将上面的代码存储为people.py,然后运行,结果如下:

    image.png

    2.使用类和实例

    (1)给属性指定默认值

    这个可以在定义类的init()方法时设置。
    书上说:“类中每个属性都必须有初始值,哪怕是0或者空字符串。”(P143)
    这句话不是很理解,因为他自己的例子也么有给初始值!

    抛开这个不管,还有一种方法设置默认值!
    那就是在init()方法里面直接指定。

    def __init__(self,name,sex,age):
            '''初始化姓名、性别和年龄'''
            self.name = name
            self.sex = sex
            self.age = age
            self.country = 'China'
    *:以这种方法指定默认值时,定义init()时不需要包含country这个形参。
    并且,实例化的时候,不需要也不允许传递这个参数。否则会报错。
    

    (2)修改属性的值

    总共两种方法:

    1.直接修改属性的值
    (接上例)
    实例化:zhangsan = People('zhangsan','man','18')
    直接修改:zhangsan.sex = 'woman'
    2.通过方法修改
    需要在类里面定义一个修改属性的方法,然后调用它来修改属性。
    *:当属性的默认值时在init()方法里面直接指定时,只能这样修改属性。
    (接上例)
    在People类中定义一个change_country()的方法:
    def change_country(self,new_country):
        self.country = new_country
    *:注意这个self不能少!这个self不能少!这个self不能少!
    实例化:zhangsan = People('zhangsan','man','18')
    通过方法修改属性:zhangsan.change_country('USA')
    

    3.继承

    1.子类会继承父类的所有属性和方法,且还可以自己定义新的。
    2.创建子类时,父类必须包含在当前的文件中,且位于子类的前面。
    (在后面用到了导入以后,应该可以不需要这样了,只需先导入父类)
    3.定义子类时,要用到父类的名字:class 子类名(父类名):

    (1)子类的init()方法

    子类的init()方法需要先初始化父类的属性,通过下面的语句来实现:
    def __init__(self,name,sex,age)
        """初始化父类的属性"""
        super().__init__(name,sex,age)
    *:super()是一个特殊函数,实现将父类和子类关联起来。
    

    (2)给子类定义属性和方法

    这个与类的定义时一样的

    (3)重写父类的方法

    很简单,定义一个方法,名字与父类中的方法名一样就行。

    (4)将实例用作属性:也就是在一个类中调用另一个类的实例作为属性

    这个实现了将大型的类拆为很多个小类。

    下面看一个小栗子,将上面讲到的继承相关的串一下:

    class People():
        '''尝试对人进行简单的抽象。'''
        def __init__(self,name,sex,age):
            '''初始化姓名、性别和年龄'''
            self.name = name
            self.sex = sex
            self.age = age
            self.country = 'China'
        def sit(self):
            '''模拟人会坐下'''
            print(self.name.title() + ' is sitting!')
        def change_country(self,new_country):
            self.country = new_country
    
    class Bodysize():
        '''定义一个身体数据类,等下实现将实例作为属性。'''
        def __init__(self,height,weight ):
            self.height = height
            self.weight = weight
        def body_data(self):
            print("I'm " + self.height + "cm tall and "+
                   self.weight + "kg weight.")
            
    class Teacher(People):
        '''定义一个老师类,继承了人这个类'''
        def __init__(self,name,sex,age):
            '''初始化人类的属性'''
            super().__init__(name,sex,age)
            #定义一个子类的属性
            self.subject = 'Physics'
            self.size = Bodysize('175','70')
    
        #定义一个子类的方法
        def simple_introduction(self):
            print("I'm a " + self.subject + " Teacher!")
    
        #重写一个父类的方法
        def sit(self):
            print(self.subject + " Teacher is sitting!")
    
    #实例化一个老师对象
    lisi = Teacher('lisi','man','28')
    #调用子类中新定义的方法
    lisi.simple_introduction()
    #调用Bodysize实例的方法
    lisi.size.body_data()
    #调用子类中重写的父类的方法
    lisi.sit()
    

    运行结果:

    image.png

    4.导入类

    将类存储在模块中,然后在主程序中导入,可以使文件更加简洁和清晰。

    导入模块/函数的几种方法(与上一章的导入函数类似):

    1.直接导入整个模块
    import 模块名
    **:调用时,需要使用句点(.)指定模块和类。
    即:模块名.类名()
    2.导入模块中的特定类
    from 模块名 import 类名
    **:使用这种方法时,实例化指定的类时,不需要使用句点(.)指定模块,
        可以直接用类名来实例化。
    3.导入模块中的多个特定类
    from 模块名 import 类名1,类名2
    **:也就是用逗号(,)实现多个类同时导入。
    4.导入模块中所有的类
    from 模块名  import *
    **:使用这种方法时,调用该模块中的所有类都不需要使用句点(.)指定模块名。
    这种方法不推荐,理由和导入函数一样的,这种方法都是不推荐的。
    5.在一个模块中导入另一个模块
    这个没什么特别的。需要啥就导入啥。
    

    5.Python标准库

    这一节实际上没说什么,就是告诉你:
    Python标准库实际上就是一组模块,里面有很多类和函数。

    6.类编码风格

    这个又是告诉你很多“龟腚”,但是,这些龟腚是有用的!
    熟悉编码风格,养成良好的习惯,
    一来可以让你的代码更清晰,二来也方便别人阅读指点。

    1.类名中的每个单词的首字母都要大写,而且不用下划线;
    2.实例名和模块名都使用小写,用下划线分隔单词;
    3.类和模块的定义后面写一个文档字符串(跟函数一样的);
    4.合理使用空行,但不要滥用:
      模块里面的不同类之间,用2个空行;
      类里面的不同方法之间使用一个空行;
    5.需要同时导入标准库中的模块和自己写的模块时,
      先导入标准库的,
      然后加一个空行,
      再导入自己写的模块。
    -->这样的好处是让别人知道你的模块都来自那些地方。
    

    这一章写的很困难,不过梳理一下,自己是可以搞清楚多了!
    如果哪里有错漏,请不吝赐教!

    相关文章

      网友评论

          本文标题:Python编程:从入门到实践 Day9

          本文链接:https://www.haomeiwen.com/subject/nwralftx.html