python入门16课_第16课 Python面向对象入门

一、什么是面向过程

面向过程是按照步骤进行的

有明确的步骤

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

把冰箱的门打开

把大象拉到冰箱门口

把大象推进冰箱里面

把冰箱门关起来

二、什么是面向对象

面向对象是基于对象本身的

没有固定步骤,只有相应的行为和属性

案例:把大象装进冰箱

有两个对象:大象和冰箱

大象的行为:走路,吃东西,睡觉

大象的属性:耳朵大,四条腿,鼻子长,体重高

冰箱的行为:开门,关门,冰冻,装东西

冰箱的属性:立方体的、黑色、品牌、型号

通过调用装东西的这个行为,就可以把大象装进冰箱

三、类和实例

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

实例就是某个类下具体的某样东西。比如:大象叫什么名字,多重,吃多少东西,几岁了。实例就是区别与别的东西,类的命名首字母建议大写

__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>加入了冰箱!

# 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)保护属性

保护属性 属性和方法名称前面是一个下划线(_), 实例对象可以方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值