python中如何对一个属性或方法进行封装_python学习第20天

一.面向对象oop - 封装

1.类中封装:

成员属性和成员方法

2.封装等级

公有:公有成员既能够在类外调用,也可以在类调用

私有:私有成员不能够在类外调用,可以在类内调用 (前面加上双下划线表示)

3.调用语法:

对象.属性

对象.方法

4.类中的绑定方法(方法在类的内部)

1)绑定到对象(对象调用方法时,系统自动把该对象当成参数进行传递)

2)绑定到类(对象或者类调用方法时,系统自动把该类当成参数进行传递)

class MyCar():

# 公有成员属性

color = "屎黄色的"

# 私有成员属性

__logo = "五菱宏光"

# 公有成员方法

def drive(self):

print("我的小车可以跑高速,可以泡妹子",self.color)

# 私有成员方法

def __info():

print("我的价格是保密的,我的油耗也是保密的")

1.1对象的相关操作

类的实例化

obj = MyCar()

调用属性

print(obj.color)

调用方法

对象调用方法时,系统会自动把该对象当成参数传递到该方法中

为了保证形参实参一一对应,在定义方法时候,要加形参self,这个方法也叫绑定方法(绑定到对象)

obj.drive()

添加成员属性

obj.color = "武士黑"

# __dict__ 查看对象或者类当中的成员,返回一个字典

print(obj.__dict__)

print(obj.color)

obj.drive()

添加成员方法

# (1) 动态添加无参方法

def dahuangfeng():

print("变形!请叫我大黄蜂")

# 对象.属性(自定义的) = 方法

obj.dahuangfeng = dahuangfeng

obj.dahuangfeng()

# (2) 动态添加有参方法

# 1.基础版

def qingtianzhu(name):

print("变形!请叫我一柱擎天,简称{}".format(name))

# 对象.属性(自定义的) = 方法

obj.qingtianzhu = qingtianzhu

obj.qingtianzhu("擎天柱")

# 2.升级版

def qingtianzhu(obj,name):

print("变形!请叫我一柱擎天,简称{},我的颜色是{}".format(name , obj.color))

# 对象.属性(自定义的) = 方法

obj.qingtianzhu = qingtianzhu

obj.qingtianzhu(obj,"擎天柱")

# 3.高级版(创建一个绑定方法,自动传递obj对象) 在类外,让系统自动帮助传递obj这个对象参数

import types

def qingtianzhu(self,name):

print("变形!请叫我一柱擎天,简称{},我的颜色是{}".format(name , self.color))

# 通过MethodType 来创建一个绑定方法,自动传递obj对象

# types.MethodType(函数,对象) 当调用方法时,自动把对象当成参数传递给该方法.

obj.qingtianzhu = types.MethodType(qingtianzhu,obj)

obj.qingtianzhu("擎天柱")

# (3) 动态添加lambda 匿名函数

obj.weizhentian = lambda : print("变形! 请叫我威震天")

obj.weizhentian()

1.2类的相关操作

定义一个类

class MyCar():

# 公有成员属性

oil = "2.0T"

# 私有成员属性

__price = "5000万"

# 公有无参方法

def oil_info():

print("我的油耗是百公里1000升,发动机是2.0T")

# 私有无参方法

def __price_info():

print("我的价格信息")

定义的类访问公有成员属性和方法

print(MyCar.oil)

# MyCar.__price error

MyCar.oil_info()

定义的类动态添加公有成员属性和方法

# 添加公有成员属性

MyCar.logo = "兰博基尼"

print(MyCar.__dict__)

# 添加公有成员方法

# (1) 动态添加公有无参方法

def fangxiangpan():

print("制造方向盘的方法")

# 类.成员(自定义名字) = 方法

MyCar.fangxiangpan = fangxiangpan

MyCar.fangxiangpan()

# (2) 动态添加公有有参方法

def engine(dongli):

print("我的发动机是%s"%(dongli))

MyCar.engine = engine

MyCar.engine("四缸发动机")

# (3) 动态添加lambda表达式

MyCar.luntai = lambda pinpai : print("我的轮胎使用的品牌是%s" % pinpai)

MyCar.luntai("米其林")

print(MyCar.__dict__)

类和对象之间的注意点

类中的成员只归属于当前这个类本身

对象可以调用其中的公有成员,但是没有修改和删除的权利,因为都归属于类,不是对象中的成员

类无法调用对象中的相关成员,但是对象可以调用类中的相关成员.

对象调用类中的成员时

调用对象中的成员时,先看看自己有没有该成员,

如果有,那么就先调用自己的

如果没有,那么就调用类的.

1.3类中的私有成员

class Plane():

# 公有成员属性

captain = "魏富强"

# 私有成员属性

__airsistem = 3

# 公有绑定方法

def fly(self):

print("飞机会飞,百公里油耗2万升1")

# 公有无参方法

def fly2():

print("飞机会飞,百公里油耗2万升2")

# 私有绑定方法

def __plane_info(self):

print("飞机上的空姐数量是保密的,个数%d" % (self.__airsistem))

# 私有无参方法

def __plane_info2():

print("飞机上的空姐数量是保密的,个数%d" % (Plane.__airsistem))

# 用pub_info调用私有成员属性和方法

def pub_info(self):

print(self.__airsistem) # 3

self.__plane_info()

def pub_info2():

print(Plane.__airsistem)

Plane.__plane_info2()

实例化对象

obj = Plane()

obj.fly()

Plane.fly2()

print(Plane.__dict__)

1.如何在类外调用私有成员

1)私有成员的改名策略 [_类名__成员名] (面向监狱编程,不推荐)

print(Plane.__dict__)

print(obj._Plane__airsistem)

print(Plane._Plane__airsistem)

obj._Plane__plane_info()

Plane._Plane__plane_info2()

2)利用类内公有方法间接调用私有成员(推荐)

obj.pub_info()

Plane.pub_info2()

2.删除相关成员

1)实例化的对象删除公有成员属性和方法

obj.captain = "王思聪"

print(obj.__dict__)

# 删除属性

del obj.captain

print(obj.__dict__)

# 如果对象有该成员,先调用自己的,没有的话,调用类的.如果都没有,报错

print(obj.captain)

# 删除方法

obj.func = lambda : print("开飞机是为了泡妞")

obj.func()

# Plane.func() error

del obj.func

# obj.func() error

2)定义的类删除公有成员属性和方法

# 删除属性

del Plane.captain

# print(Plane.captain)

# obj.captain error # 对象和类当中,没有 captain 成员

# 删除方法

# del Plane.fly

# obj.fly() error

# 注意点

obj.fly = lambda : print("112233")

del Plane.fly

del obj.fly

obj.fly()

1.4魔术方法(init)

#__init__魔术方法(构造方法)

'''

触发时机:实例化对象,初始化的时候触发

功能:为对象添加成员

参数:参数不固定,至少一个self参数

返回值:无

'''

1.基本语法

class MyClass():

def __init__(self):

print(11)

self.name = "张婕"

print(22)

# 实例化对象

print(33)

obj = MyClass()

print(44)

print(obj.name)

print(55)

2.带有多个参数的构造方法

class MyClass():

def __init__(self,name):

# 对象.成员属性(自定义) = 参数值

self.name = name

# 实例化 (如果构造方法里面含有额外参数,在实例化时,需要传参)

obj = MyClass("刘敏")

print(obj.name)

3.类可以是一个,对象可以使多个,可以通过一个类实例化多个不同的对象

每创建一个对象,都会单独占用一个空间,创建的越多,占用的空间就越大

class Children():

def __init__(self,name,skin):

self.name = name

self.skin = skin

def cry(self):

print("小孩下生直接哭~")

def drink(self):

print("小孩下生直接吸奶奶~")

def __eat(self):

print("小孩自己吃自己的手指")

def pub_func(self):

print("该对象的名字是{},该对象的肤色是{}".format(self.name,self.skin))

# 注意点

def pub_func2(self,name,skin):

print("该对象的名字是{},该对象的肤色是{}".format(name,skin))

# 创建第一个对象

afanda = Children("王铁锤","蓝色")

afanda.cry()

afanda.pub_func()

# 创建第二个对象

dan = Children("王钢蛋","黑色")

dan.drink()

dan.pub_func()

# 创建第三个对象

bao = Children("王宝强","绿色")

bao.pub_func()

# 注意点:

bao.pub_func2("尉翼麟","白色")

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值