ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

day21.面向对象程序设计及面向对象封装

2020-08-07 21:33:14  阅读:296  来源: 互联网

标签:__ obj MyCar 成员 day21 面向对象 print 封装 方法


一、oop面向对象的程序开发

1、类的定义

class MyClass:    
    pass
    
class MyClass(): #(推荐)
    pass
    
class MyClass(object):
    pass

2、类的实例化

class MyCar():
    color = "黄色的"
     
# 实例化对象 (类的实例化)
obj = MyCar() # object -> obj

3、类的基本结构

"""
1.成员属性
2.成员方法
"""
class MyCar():
    # 成员属性
    color = "天蓝色的"
    # 成员方法
    def didi():
        print("小车会滴滴叫")
# 反例: 这种写法可以直接在python当中执行,但是严禁使用
# 如果想要表达逻辑或者循环,需要写在成员方法当中,不能直接裸露的写在类当中,会破坏类中结构.
"""
class MyCar():
    if 5 == 5:
        print("打印成功123456")
"""

4、类的命名

# 驼峰命名法 : 推荐起类名的时候,使用大驼峰命名法.
# mycar -> MyCar   mymouse => MyMouse

二、oop 面向对象封装----对象的相关操作

"""
封装等级:
    (1) 私有 : 在类的内部可以访问,在类外不可以
    (2) 公有 : 在类的内部可以访问,在类外也可以访问

封装成员:
    (1) 成员属性
    (2) 成员方法

调用成员:
    (1) 对象.成员属性
    (2) 对象.成员方法

绑定方法:
    (1) 绑定到对象 : 对象调用方法时,系统自己默认传递该对象,作为一个参数传递到当前方法中
    (2) 绑定到类   : 对象或者类调用方法时,系统自己默认传递该类,作为一个参数传递到当前方法中
"""
 

1、对象访问属性方法

class MyCar():
    # 公有成员属性
    color = "屎黄色"
    logo =  "中国吉利汽车"
    # 私有成员属性
    __price = "2000万"
    
    # 公有成员方法
    def run(self):
        print("小车会跑,百公里0.01秒,颜色{}".format(self.color)) # self <=> obj 
    # 私有成员方法
    def __info(self):
        print("车主信息是保密的,传说是京城有名的富二代")
        
# 实例化对象(类的实例化)
obj = MyCar()
定义类:共有、私有属性及方法
# 访问属性
print( obj.color    )
# obj.__price error  # 私有成员属性不能够在类外调用

# 访问方法
obj.run()
# obj.__info() error  # 私有成员方法不能够在类外调用
实例化对象访问公有成员属性和方法  

2、通过对象添加属性方法

2.1、实例化的对象动态添加公有成员属性

(1).在类外动态添加成员属性 -> obj对象
# obj.logo = "五菱宏光"
# print(obj.logo)
# __dict__ 是获取类对象中的成员
print(obj.__dict__)
实例化的对象动态添加公有成员属性

2.2、实例化的对象动态添加公有成员方法------无参方法

def dahuangfeng():
    print("变形! 我是大黄蜂~")

obj.dahuangfeng = dahuangfeng
obj.dahuangfeng()

2.3、实例化的对象动态添加公有成员方法------有参方法

基础版

def qingtianzhu(name):
    print("请我叫我一柱擎天,简称{}".format(name))

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

升级版 

def qingtianzhu(obj,name):
    print("请我叫我一柱擎天,简称{},颜色是{}".format(name,obj.color))
obj.qingtianzhu = qingtianzhu
obj.qingtianzhu(obj,"擎天柱")

终极版 (即使调用类外动态创建的方法,也让系统自己传递obj对象本身)

'''在类外调用自定义方法时,系统不会自动传递obj对象参数'''
import types
def qingtianzhu(obj,name):
    print("请我叫我一柱擎天,简称{},颜色是{}".format(name,obj.color))
# MethodType(方法,对象) 把哪个方法和哪个对象绑定到一起,形成绑定方法
obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
obj.qingtianzhu("擎天柱")

# 3.lambda 表达式
obj.weizhentian = lambda : print("我是威震天~ ")
obj.weizhentian()

 

三、oop 面向对象封装----类的相关操作

"""
类调用的方式:
    类.成员属性
    类.成员方法
类中的无参方法只能是类来调用.
"""
class MyCar():
    # 公有属性
    oil = "2.0T"
    # 私有属性
    __price = "5000千万"
    # 公有方法
    def oil_info():
        print("百公里油耗是500升",MyCar.color)
    # 私有方法
    def __price_info():
        print("我的油耗信息是保密的")

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

# 访问公有成员属性
print(MyCar.oil)
# MyCar.__price     error # 无法在类外访问私有成员属性

# 访问公有成员方法
MyCar.oil_info()
# MyCar.__price_info() error # 无法在类外访问私有成员方法

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

2.1、添加成员属性

MyCar.color = "屎绿色"
print(MyCar.color)
# 查看类对象内部成员使用__dict__,返回的是字典
print(MyCar.__dict__)
# MyCar.oil_info()

2.2、添加成员方法

1、无参方法

def fangxiangpan():
    print("改造方向盘的方法")
MyCar.fangxiangpan = fangxiangpan
MyCar.fangxiangpan()

print(MyCar.__dict__)

2、有参方法

def fadongji(engin):
    print("动力引擎改成{}".format(engin))
MyCar.fadongji = fadongji
MyCar.fadongji("三缸发动机")

3、lambda 表达式

MyCar.luntai = lambda name : print("使用{}的轮胎".format(name))
MyCar.luntai("米其林")

print(MyCar.__dict__)

 

obj = MyCar()
# obj.logo = "柯尼塞格"
# print(MyCar.logo) error 类不能返回来调用对象中的成员

MyCar.logo = "别摸我,我是宝马bwm"
obj.logo = "柯尼塞格"
print(obj.__dict__)
print(obj.logo)

 

 

"""
# 类和对象之间的区别
对象可以调用类中的成员属性和方法,返过来,类不能调用对象中的成员.
类中的成员属性和方法归属于类本身,对象可以使用,但是没有修改和删除的权利.
对象在调用相应成员时,先看看自己有没有
    如果有,调用自己的
    如果没有,调用类中的成员
    如果类中成员也没有,直接报错.
"""

 

四、访问类中私有成员

class Plane():
    # 公有属性
    captain = "宋云杰"
    # 私有属性
    __sistem = 10
    
    # 公有绑定方法
    def fly1(self):
        print("我的飞机可以倒着飞1")
        
    # 公有普通方法
    def fly2():
        print("我的飞机可以倒着飞2")
        
    # 私有绑定方法
    def __fly_info1(self):
        print("我的飞机,百公里油耗是5万升1")
        
    # 私有普通方法
    def __fly_info2():
        print("我的飞机,百公里油耗是5万升2")
        
    # 公有绑定方法->间接调用私有成员
    def pub_info1(self):
        print(self.__sistem)
        self.__fly_info1()
        
    # 公有普通方法->间接调用私有成员
    def pub_info2():
        print(Plane.__sistem)
        Plane.__fly_info2()
View Code

1、改名策略

'''
关于python私有化的实现方法: 改名策略
_类名 + 私有成员 => 改名策略
'''
# 方法一.调用私有成员 (不推荐使用改名策略找到私有成员,破坏封装性)
# 对象调用类中的私有成员
obj = Plane()
print(obj._Plane__sistem)
obj._Plane__fly_info1()

# 类调用类中的私有成员
print(Plane._Plane__sistem)
Plane._Plane__fly_info2()
print(Plane.__dict__)

2、类或对象利用公有方法,间接找到私有成员(推荐)

obj.pub_info1()
Plane.pub_info2()

 

五、实例化的对象/定义的类 删除公有成员属性 和 公有成员方法

删除属性

# 1.公有成员属性
# 对当前对象添加成员属性叫captain
obj.captain = "王浩"

# 删除当前对象中的成员属性captain
del obj.captain

# 删除类当中的成员属性captain
del Plane.captain

# 无论是类还是对象都没有该属性,所以报错;
# print(obj.captain) error

删除方法

# 2.公有成员方法
Plane.add_sistem = lambda self: print("因为业务需要,需要增加空姐","<====>")

# del Plane.add_sistem
Plane.add_sistem(1)
obj.add_sistem()
# 删除类中的成员方法
del Plane.add_sistem
# obj.add_sistem() error 发现被删找不到了

obj.paoniu = lambda : print("我的飞机可以用来泡妞")
obj.paoniu()
# 删除对象中的成员方法
del obj.paoniu
# obj.paoniu() error

print(obj.__dict__) # {}
print(Plane.__dict__)

 

标签:__,obj,MyCar,成员,day21,面向对象,print,封装,方法
来源: https://www.cnblogs.com/kongxiangqun/p/13455163.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有