面向对象(类)

对象

什么是对象?

在Python中一切皆对象!这句话是贯穿我们整个Python编程的核心思想。在面向对象程序设计中,对象基本上可以看做特性以及由一系列可以存取、操作这些数据的方法组成的集合。使用对象替代全局变量和函数的原因可能有很多,其中对象最重要的优点以下几点:

  • 多态
  • 封装
  • 继承

一、多态

不同类的对象使用同样的操作,也可以说是同类事物的多种形态

怎么去理解同种事物的多种形态?如下面的例子:

1.鸡和猪和狗,三者都是同类的生物,但是却是不同的表现形式

2.在Python的数据类型中也有很多这样的例子如序列的多种形态有字符串、列表、元祖..

那么在程序中怎么去体现:

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:生物
    @abc.abstractmethod
    def talk(self):
        pass

class chicken(Animal): #动物的形态之一:人
    def talk(self):
        print('say hello')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say aoao')


在上述程序中,定义了三个类(鸡、狗和猪),三个类继承一同一个类(生物),即同为一种类-->生物,所以他们都有共同的属性就是都会talk,在上例中我们采用的继承的方式这里也是需要大家明白:一个抽象类有多个子类,因而多态的概念依赖于继承

二.继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类,本质的意义是可以减少程序的重复代码

怎么去解释什么是类,可以将它或多或少地视为种类或者类型的同义词。从很多方面方面来说这就是类———— 一种对象。所有的对象都属于一个类,称为类的实例。

下面我们先创建一个类:

class people:   #人类
   
    def walk(self):
        print("%s is walking"%self.name)
    
    def foo(self):
        print("from father %s" %self.name)

上例包含了两个方法定义,现在我们将这个例实例化一个对象:

class people:

    def walk(self,name):
        self.name=name
        print("%s is walking"%self.name)
    def foo(self):
        print("from father %s" %self.name)

t1=people()
t1.walk("whatmini")


"D:\Program Files\python.exe" E:/py_code/FTP项目/server端/调试模块.py
whatmini is walking

Process finished with exit code 0


通过上例结果一目了然,应该能说明self的用处了。在调用t1的walking函数时t1会自动将自己作为第一个参数传入函数中————因此命名为self。对于这个变量,每个人可能都会有自己的叫法,但是因为它总是对象自身,所以习惯叫它self。

同时需要知道的是特性也是可以在外部进行访问的如:


class people:

    def walk(self,name):
        self.name=name
        print("%s is walking"%self.name)
    def foo(self):
        print("from father %s" %self.name)

t1=people()
t1.walk("whatmini")
print(t1.name)

"D:\Program Files\python.exe" E:/py_code/FTP项目/server端/调试模块.py
whatmini is walking
whatmini

Process finished with exit code 0


  • 类的特性、函数和方法

self 参数事实上正是方法和函数的区别。方法(专业来讲可以称为绑定方法)将他们第一个参数绑定到所属的实例上,因此你无需显示提供该参数。当然也可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数:

class Class:
    def method(self):
        print("I have a self")

def func():
    print("I don't..")

t1=Class()
t1.method()
t1.method=func
t1.method()

"D:\Program Files\python.exe" E:/py_code/FTP项目/server端/调试模块.py
I have a self
I don't..

Process finished with exit code 0

需要注意的是,self参数并不依赖于调用方法的方式,可以随意使用其他变量引用同一个方法:

class Bird:
    song="squaawk!"
    def sing(self):
        print(self.song)

bird=Bird()
bird.sing()
birdsong=bird.sing
birdsong()

"D:\Program Files\python.exe" E:/py_code/FTP项目/server端/调试模块.py
squaawk!
squaawk!

Process finished with exit code 0


尽管最后一方法的调用看起来和函数十分相似,但是变量birdsong引用绑定方法bird.sing上,也就意味着这还是会对self参数进行访问(也就是说它仍旧绑定到类的相同实例上)

  • 实例化(_ init _)

类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例后的对象定制自己的特性

class people:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def walk(self):
        print("%s is walking"%self.name)
    def foo(self):
        print("from father %s" %self.name)

t1=people("whatmini",18,"man")
print(t1.name)
print(t1.age)
print(t1.sex)

"D:\Program Files\python.exe" E:/py_code/FTP项目/server端/调试模块.py
whatmini
18
man

Process finished with exit code 0


上例可以知道init的作用就是对实例化的对象进行初始化作用

posted @ 2017-07-14 18:36  Sun珊珊来迟  阅读(144)  评论(0编辑  收藏  举报