python的类和对象(1)

类和对象

现在这年头,怎么哪里都有对象?街上看了一路手拉手,回来学习还要看到”对象“。
是不是学会了对象,就有对象了?

1.定义:

百度解释:
对象是对客观事物的抽象,类是对对象的抽象。类是一种抽象的数据类型。
它们的关系是,对象是类的实例,类是对象的模板。
港真,第一次接触这么专业的词语时,我是懵逼的。

看来,对象不是那么好找的。

好了,正经一点。要学习的呢! 什么是类,什么是对象呢?
通俗一点讲:
拿化妆这件事来比喻,可以把类理解成“妆容”(一个大概念),而对象可以理解成“烟熏妆”、“复古妆”、“咬唇妆”、“新娘妆”(具体的妆容)。
又或者拿我们吃的面来讲,可以把类理解成“面”,

而对象可以理解成“热干面”、“牛肉刀削面”、“葱油拌面”、“川味凉面”……等等。

可以看出,类就是一个抽象的概念,它不具体指代某一样东西。类似上级下达的一个总方针、指令(看做一个类),而对象就是具体到每一个人的实行方案。每位员工在接到上级命令后,因不一样的处境、逻辑思维,最后,小明有了小明的执行方案(对象A),小红有了小红的执行方案(对象B)。
可以说,类是一个基础,在此基础上,发展出了各个对象。(就像有了爸爸,后来有了很多很多个可爱的儿子(●'◡'●)。)

2.说说为什么要用类

故事是这样子滴
Hush 今天想画个烟熏妆,流程如下:
洁面 --- 化妆水 --- 面部精华 --- 乳液/面霜 --- 防晒霜 --- 粉底 --- 散粉 --- 画眉 --- 腮红 --- 口红

#烟熏妆
def MakeupSmokyClean():
    #清洁步骤
    print("烟熏妆清洁完毕")

def MakeupSmokyWater():
    #补水步骤
    print("烟熏妆补水完毕")
    
def MakeupSmokyeEssence():
    #搽精华步骤
    print("烟熏妆搽精华液完毕")
    
def MakeupSmokyCream():
    #搽面霜步骤
    print("烟熏妆搽面霜完毕")
    
def MakeupSmokySunscreen():
    #防晒步骤
    print("烟熏妆防晒完毕")
    
def MakeupSmokyFoundation():
    #上粉底步骤
    print("烟熏妆上粉底完毕")
    
def MakeupSmokyLoosepowder():
    #上散粉步骤
    print("烟熏妆定妆完毕")
    
def MakeupSmokyEyebrows():
    #画眉步骤
    print("烟熏妆画眉完毕")
    
def MakeupSmokyBlush():
    #上腮红步骤
    print("烟熏妆画腮红完毕")
    
def MakeupSmokyLipstick():
    #涂口红步骤
    print("烟熏妆涂口红完毕")

def MakeupSmokyCheck():
    #最后检查一下
    print("检查完毕")
    
MakeupSmokyClean()
MakeupSmokyWater()
MakeupSmokyeEssence()
MakeupSmokyCream()
MakeupSmokySunscreen()
MakeupSmokyFoundation()
MakeupSmokyLoosepowder()
MakeupSmokyEyebrows()
MakeupSmokyBlush()
MakeupSmokyLipstick()
MakeupSmokyCheck()
烟熏妆清洁完毕
烟熏妆补水完毕
烟熏妆搽精华液完毕
烟熏妆搽面霜完毕
烟熏妆防晒完毕
烟熏妆上粉底完毕
烟熏妆定妆完毕
烟熏妆画眉完毕
烟熏妆画腮红完毕
烟熏妆涂口红完毕
检查完毕

终于画完了!画个妆不容易呀!
Hush 坐下来,看了看 Taylor 的照片,想了想要不明天来个复古妆?

于是,第二天出门前,Hush又开始她的化妆表演……

#复古妆
def MakeupRetroClean():
    #清洁步骤
    print("复古妆清洁完毕")

def MakeupRetroWater():
    #补水步骤
    print("复古妆补水完毕")
    
def MakeupRetroEssence():
    #搽精华步骤
    print("复古妆搽精华液完毕")
    
def MakeupRetroCream():
    #搽面霜步骤
    print("复古妆搽面霜完毕")
    
def MakeupRetroSunscreen():
    #防晒步骤
    print("复古妆防晒完毕")
    
def MakeupRetroFoundation():
    #上粉底步骤
    print("复古妆上粉底完毕")
    
def MakeupRetroLoosepowder():
    #上散粉步骤
    print("复古妆定妆完毕")
    
def MakeupRetroEyebrows():
    #画眉步骤
    print("复古妆画眉完毕")
    
def MakeupRetroBlush():
    #上腮红步骤
    print("复古妆画腮红完毕")
    
def MakeupRetroLipstick():
    #涂口红步骤
    print("复古妆涂口红完毕")

def MakeupRetroCheck():
    #最后检查一下
    print("检查完毕")
    
MakeupRetroClean()
MakeupRetroWater()
MakeupRetroEssence()
MakeupRetroCream()
MakeupRetroSunscreen()
MakeupRetroFoundation()
MakeupRetroLoosepowder()
MakeupRetroEyebrows()
MakeupRetroBlush()
MakeupRetroLipstick()
MakeupRetroCheck()
复古妆清洁完毕
复古妆补水完毕
复古妆搽精华液完毕
复古妆搽面霜完毕
复古妆防晒完毕
复古妆上粉底完毕
复古妆定妆完毕
复古妆画眉完毕
复古妆画腮红完毕
复古妆涂口红完毕
检查完毕

哇,终于画完了,每次化妆都要这么久,如果我活个八十岁,那不是要……
然后,Hush赶不上7点40分的地铁。最后迟到了。
老板要扣钱!扣钱!扣钱!
稳食艰难 看看自己的口袋,啊,我的钱,不活了……
But……
主角不能死啊,于是,Hush慢慢冷静下来
Hush想:有没有一个神器,可以让这些通用的步骤一键完成,其他的(比如高光、遮瑕、眼影,balabala的)化妆步骤在Hush心情特别好 or 出席隆重场合时才特别写出来呢?

上天保佑,大神们早早就创造出了 Hush 想要的“类”
类把通用的特性封装在一个盒子里,你想用的时候调用这个类就行了。
如果你有新的有独创性的东西,你可以重新 def 一下你需要重新定义的,覆盖掉以前的写的东西,其他没改变的地方就不用重新def (不写就代表你继续用以前的方法,不做改变),这样你就可以剩下很多很多的时间啦。时间诚可贵呀!

下面是时候见识一下的强大啦:

class Makeup(object):
    "基本化妆步骤"
    def __init__(self, style):
        self.style = style
        
    def Clean(self):
        #清洁步骤
        print(self.style + "清洁完毕")

    def Water(self):
        #补水步骤
        print(self.style + "补水完毕")
    
    def Essence(self):
        #搽精华步骤
        print(self.style + "搽精华液完毕")
    
    def Cream(self):
        #搽面霜步骤
        print(self.style + "搽面霜完毕")
    
    def Sunscreen(self):
        #防晒步骤
        print(self.style + "防晒完毕")
    
    def Foundation(self):
        #上粉底步骤
        print(self.style + "上粉底完毕")
    
    def Loosepowder(self):
        #上散粉步骤
        print(self.style + "定妆完毕")
    
    def Eyebrows(self):
        #画眉步骤
        print(self.style + "画眉完毕")
    
    def Blush(self):
        #上腮红步骤
        print(self.style + "画腮红完毕")
    
    def Lipstick(self):
        #涂口红步骤
        print(self.style + "涂口红完毕")
    
    def Check(self):
        #检查
        print("检查完毕")

    def integrate():
        #一键组合
        Clean()
        Water()
        Essence()
        Cream()
        Sunscreen()
        Foundation()
        Loosepowder()
        Eyebrows()
        Blush()
        Lipstick()
        Check()
        print(self.style + "一键组合完毕")

在类里面,参数 style 可以是我们想要的各种妆容,可以是烟熏妆、复古妆、新娘妆……
不用每一次画一种妆,都要一步一步地写同样的东西啦……
相当于有了个基本框架 Makeup,我们具体的每一种妆容可以继承这个框架,也可以修改框架里的东西,也可以扩展新的东西。这就是类的绝妙之处啦!

我们较完整的化妆步骤为:
洁面 --- 化妆水 --- 面部精华 --- 乳液/面霜 --- 防晒霜 ---粉底---(遮瑕)---散粉---画眉---眼影---眼线---睫毛膏---修容---高光----腮红---口红
如果我们想在上面已写的程序基础上,加个眼影、眼线,那么我们就要在上面Makeup的基础上,加上

class Advanced1(Makeup):   #儿子写在前面,爸爸写在括号里(正经点,就是派生类在外面,基类在括号里)
    def Eyeshadow(self):
        #画眼影
        print(self.style + "画眼影完毕")
    
    def Eyeliner(self):
        #画眼线
        print(self.style + "画眼线完毕")

其他步骤不用重复写,就相当于直接继承老爸的特性。
意味着 Hush 完成了 :洁面 --- 化妆水 --- 面部精华 --- 乳液/面霜 --- 防晒霜 --- 粉底 --- 散粉 --- 画眉 --- 腮红 --- 口红。

And then,因为每种妆容的特点是不一样的,我们拿眉型来说,不一样的妆容,它强调的东西、想要表达的东西是不一样的,那么眉头、眉峰、眉尾、眉的倾斜度、眉的长度是不一样的。
比如我们今天回家,第一,考虑到不化妆,可能有点残,爸爸妈妈以为我经历了什么风霜;第二,化太浓,老爸老妈会担心,女儿是不是在外面学坏了。Consequently,今天要画淡妆。要这样这样画:

class Advanced2(Makeup):
    def Eyebrows(self):
        #淡妆画眉步骤,bala bala
        print(self.style + "画眉完毕")

这就相当于覆盖了原来的画眉方法(也可以说,重写了画眉步骤)。这样,我们就有了淡妆的专属眉妆。

从整个复杂、漫长的化妆过程来看,我们深有体会到类的好处。
有了类,我们可以支配更多的时间。
In conclusion:
类的好处最能体现在继承这一点上。

  • 我们可以直接复用代码,不用花时间写重复的东西,同时可以降低出错率
  • 我们也可以在类的基础上,扩展新方法

Consequently,我们要用到类来帮助我们成为一个懒惰的程序员呀。

3.什么是类、对象

下面放上官方解释:

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

可以说,类 = 属性 + 方法

#常见格式
class ClassName:  #类的名字,采用大驼峰命名法
    <statement-1>
    .
    .
    .
    <statement-N>

在statement里,一般会定义类的属性和方法。

而对象是类的实例化。在实例化后,就可以用类的属性和方法啦。

**举个栗子:实例化一个类并用其属性及方法 **
先定义一个类

class Beauty():
    #定义一个类,有属性,有方法
    name = "Taylor"
    
    def Words(self):
        return("You are my sunshine.")
a = Beauty()   #将类Beauty实例化

print("类Beauty的属性 name 为:", a.name)

print("类Beauty的方法 Words 为:", a.Words())
类Beauty的属性 name 为: Taylor
类Beauty的方法 Words 为: You are my sunshine.


哎呀,我女神真漂亮,我什么时候能变得这么beautiful呀?

先到这,下篇继续~~

posted @ 2019-05-13 23:29  喜欢吃面的猪猪  阅读(368)  评论(0编辑  收藏  举报