Python编程:从入门到实践 Day9

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

第九章 类

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.需要同时导入标准库中的模块和自己写的模块时,
  先导入标准库的,
  然后加一个空行,
  再导入自己写的模块。
-->这样的好处是让别人知道你的模块都来自那些地方。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容