当前位置:博客首页 > Python > 正文

第16课 Python面向对象入门

作者: Jarvan 分类: Python 发布时间: 2019-06-01 09:55 百度已收录

一、什么是面向过程

  • 面向过程是按照步骤进行的
  • 有明确的步骤

案例:把大象装进大的冰箱里

  1. 把冰箱的门打开
  2. 把大象拉到冰箱门口
  3. 把大象推进冰箱里面
  4. 把冰箱门关起来

二、什么是面向对象

面向对象是基于对象本身的
没有固定步骤,只有相应的行为和属性

案例:把大象装进冰箱

  • 有两个对象:大象和冰箱
  • 大象的行为:走路,吃东西,睡觉
  • 大象的属性:耳朵大,四条腿,鼻子长,体重高
  • 冰箱的行为:开门,关门,冰冻,装东西
  • 冰箱的属性:立方体的、黑色、品牌、型号
  • 通过调用装东西的这个行为,就可以把大象装进冰箱

三、类和实例

类就是分类,表明对象是属于哪个分类的,该分类有什么行为和属性,也就是区别于其他的类的东西

实例就是某个类下具体的某样东西。比如:大象叫什么名字,多重,吃多少东西,几岁了。实例就是区别与别的东西,类的命名首字母建议大写
 __main__.Elephant object at 0x00314790
命名空间            类名                内存地址

class Element:
    name = "Andy"
    weight = 1000
    height = 4

    def walk(self):# self是代表对象本身
        print('{} is walking'.format(self.name))

class Icebox:
    name = "haier"
    box = []

    def push(self,something):
        self.box.append(something)
        print("把{}加入了冰箱!".format(something))

daxiang = Element()
bingxiang = Icebox()
print(bingxiang.box)
bingxiang.push(daxiang)
bingxiang.box[0].walk()

# 本案例输出结果
# 把<__main__.Element object at 0x000001F1A0FA82B0>加入了冰箱!
# Andy is walking

四、类属性和实例属性、实例方法

  • 直接在类下面写的属性(变量)就是类属性
  • 类属性是所有的类实例对象都共享的
  • 类属性只能通过类名来修改
  • 实例对象可以调用类属性
  • 类名可以调用类属性
  • 实例属性是每个实例独有的,修改实例属性本身并不会影响到其他实例对象
  • 实例属性是在__init__函数里面声明(定义)的
  • 实例属性在实例化的时候需要制定
  • 实例化时会最先执行__init__函数,如果有参数,那么需要传入指定的参数

类名不能调用实例属性

  • 实例对象可以调用实例方法(行为)
  • 类名如果要调用实例方法的时候,需要传入具体的实例对象
  • 实例方法的第一个参数表示实例对象本身
class Element():
    def __init__(self, namer, age):
        self.name = namer
        self.age = age
        print("我是一只大象,没有调用属性和方法之前,我是先执行的")

xiang = Element("小白",18)
print(xiang.name)
# 输出结果:我是一只大象,没有调用属性和方法之前,我是先执行的  小白
# 实例化时会最先执行__init__函数

五、类方法

  • 类方法的第一个参数名称是cls,代表的是类本身
  • 类方法的声明需要使用装饰器@classmethod
  • 类名可以调用类方法
  • 实例对象也可以调用类方法

六、静态方法

  • 当一个函数,即用不到类的属性和方法,也用不到实例的属性和方法的时候,但是又想把它放在类里面方便管理,这时候就需要用到静态方法
  • 静态方法使用@staticmethod 进行修饰,表明该方法是静态方法
  • 静态方法里面是不能引用实例属性、实例方法,但是可以通过类名类调用类属性和类方法(但是不建议)
  • 实例对象和类名都可以调用静态方法
# -*- coding: utf-8 -*-
class Element:
    name = "Andy"
    weight = 1000
    height = 4

    def walk(self):# self是代表对象本身
        print('{} is walking'.format(self.name))
    @staticmethod
    def sleep(ceshi):
        print('{}静态方法的使用'.format(ceshi))

i = Element()
i.sleep("x")

# 上述通过添加@staticmethod,用到了静态方法进行修饰,使ceshi不再是跟self等同的作用,而是可以作为自由的变量
# 上述如果不添加@staticmethod,输出结果会报错:TypeError: sleep() takes 1 positional argument but 2 were given
# 添加后输出结果为:x静态方法的使用

七、魔术方法

魔术方法是python类内置的一些方法名称,以双下划线开头和结尾的

面向对象的三大特征:封装、继承、多态

class A:
    def __init__(self):
        print('实例化时我是最先执行的')

    def __del__(self):  # 析构函数
        print('对象死之前会调用我')

def foo():
        a = A()
        print('函数执行中....')

foo()

# 输出结果为
# 实例化时我是最先执行的
# 函数执行中....
# 对象死之前会调用我
class MyAdd:
    def __init__(self, x):
        self.x = x

    def __add__(self, other):
        if isinstance(other, MyAdd):
            return self.x + other.x
        raise TypeError('not support type')


a = MyAdd(10)
b = MyAdd(20)
c = a + b
print(c)

# 以上是面向对象多态的一种表现,使其具有相加的方法,最终输出结果为30

八、类的继承(单继承)

  • 子类可以继承父类,通过类名()里面放入父类的名称就可以了
  • 子类可以继承父类的属性和方法
  • 如果子类要添加自己实例属性的时候,需要重写__init__函数,并调用父类的__init__函数
  • 子类可以添加自己的方法
  • 子类也可以重写父类的方法
  • 在python3中所有类的基类是object
  • 也就是说所有的类都是直接或间接的继承object
class Mouse:

    def __init__(self,name,skin,age):
        self.name = name
        self.skin = skin
        self.age = age


class Whitemouse(Mouse):
    def __init__(self,name,skin,age,leg):
        Mouse.__init__(self,name,skin,age)
        self.leg = leg

# 以上是子类继承父类方法属性的方式之一,也可以用下面的super方法
 def __init__(self,name,skin,age,leg):
        # Mouse.__init__(self,name,skin,age)
        super(Whitemouse, self).__init__(self,name,skin,age)

九、类的继承(多重继承)

  • 要想获取所有父类的属性,那么需要显式的在__init__方法中调用父类的__init_方法
  • 假如多个父类的方法重名,默认使用的是第一个父类的方法,要想指明使用哪个父类的
  • 方法的时候,需要重写该方法,然后重写的方法里面调用指定父类的方法
  • # 多重继承的时候,需要显式的调用父类的构造函数
    # 否则默认只继承第一个父类的属性

十、类的成员私有化

  • 属性私有化
  • 方法私有化
  • 完全私有化,在属性或方法名称前面用双下划线(__)
  • 完全私有化的属性和方法只能在类的内部访问,实例对象不能访问也不能获取
  • 部分私有化(property)保护属性
  • 保护属性 属性和方法名称前面是一个下划线(_), 实例对象可以方法

发表评论