OOP-面向对象(二)

本文介绍了Python面向对象的三大特性:封装、继承和多态。详细讲解了类的成员访问控制,包括private、protected和public的区别,并通过实例展示了如何动态添加成员属性和方法。此外,还探讨了继承的概念,super的使用以及魔术方法的作用,如__init__、__del__等。最后提到了多态的概念及其在实际编程中的应用。
摘要由CSDN通过智能技术生成

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

-封装:对类中成员属性和方法的保护,控制外界对内部成员的访问,修改,删除等操作
私有的: private
	在本类内部可以访问,类的外部不可以访问.(python中 属性或者方法前面加上两个下划线 ‘__’)

受保护的:protected
        允许有继承关系的子类访问(Python开发者约定俗成的,属性或者方法前面加上一个下划线 ‘_’)

公有的: public
	在本类的内部和外部都可以访问.
属性含义
__doc__该函数的文档字符串,没有则为 None;不会被子类继承。可写
__name__该函数的名称。可写
__qualname__该函数的 qualified name。 3.3 新版功能.可写
__module__该函数所属模块的名称,没有则为 None。可写
__defaults__由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None。可写
__code__表示编译后的函数体的代码对象。可写
__globals__对存放该函数中全局变量的字典的引用 --- 函数所属模块的全局命名空间。只读
__dict__命名空间支持的函数属性。可写
__closure__None 或包含该函数可用变量的绑定的单元的元组。有关 cell_contents 属性的详情见下。只读
__annotations__包含参数标注的字典。字典的键是参数名,如存在返回标注则为 'return'。可写
__kwdefaults__仅包含关键字参数默认值的字典。可写
绑定方法:
1.绑定到对象 : 当对象去调用类中成员方法时,系统会默认把该对象当成参数传递给该方法
2.绑定到类   : 当对象或者类去调用类中成员方法时,系统会默认把该类当成参数传递给该方法
使用方式:
对象.成员属性
对象.成员方法
class Car():
    # 公有属性
    brand = "1"

    # 受保护属性
    _wheel = 4

    # 私有属性
    __price = 50000

    # 公有方法
    def run(self):
        print("百公里油耗50L,brand={} , price={}".format(self.brand, self.__price))

    # 私有方法
    def __info(self):
        print("车主信息都想看,想屁吃呢!")

# 实例化对象(类的实例化)
my_car = Car()
my_car.brand = '五菱宏光'

# (1)实例化的对象访问成员属性和方法
# 公有
print(my_car.brand)
# 其中的 __price是在类里面访问的
my_car.run()

# (2)实例化的对象动态添加公有成员属性
my_car.color = "红"

# __dict__ 获取类对象的内部成员
# 通过这个可以查看怎么内部的私有成员/修改私有成员
print(my_car.__dict__)
print(Car.__dict__)

# (3)实例化的对象动态添加公有成员方法
# 1.无参方法
def 喇叭():
    print('滴滴滴滴的的叫')

my_car.喇叭 = 喇叭
my_car.喇叭()


# 2.有参方法
# 基本版
def price(num):
    print("我的价格为{}".format(num))

my_car.price = price
my_car.price(2100)

# 升级版
def price1(num, obj):
    print("{1}现在价格为{0}".format(num, obj.brand))


my_car.price1 = price1
my_car.price1(51000, my_car)


# 究极版
"""如果要创建绑定方法,参数的顺序,self对象本身要放到第一位."""
def price1(obj,num):
    print("{}现在价格为{}".format(obj.brand, num))
import types
# 创建绑定方法,系统自动把该对象当成参数传递给方法;
# types.MethodType(方法,对象) => 绑定方法
my_car.price1 = types.MethodType(price1,my_car)
my_car.price1(20000)


# lambda表达式
my_car.引擎 = lambda : print('V12')
my_car.引擎()
-继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法
super调用父类方法
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序
issubclass(class, classinfo)
issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类
参数
    class -- 类。
    classinfo -- 类。
返回值
    如果 class 是 classinfo 的子类返回 True,否则返回 False

class A:
    pass
class B(A):
    pass
    
print(issubclass(B,A))    # 返回 True
魔术方法(特定时机自动触发)
#__init__魔术方法(构造方法)
'''
	触发时机:实例化对象,初始化的时候触发
	功能:为对象添加成员
	参数:参数不固定,至少一个self参数
	返回值:无
'''
#__new__ 魔术方法
'''
	触发时机:实例化类生成对象的时候触发(触发时机在__init__之前)
	功能:控制对象的创建过程
	参数:至少一个cls接受当前的类,其他根据情况决定
	返回值:通常返回对象或None
'''
#__del__ 魔术方法(析构方法)
'''
	触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
    功能:对象使用完毕后资源回收
	参数:一个self接受对象
	返回值:无
'''
#__call__ 魔术方法
'''
	触发时机:把对象当作函数调用的时候自动触发
	功能: 模拟函数化操作
	参数: 参数不固定,至少一个self参数
	返回值: 看需求
'''
#__str__ 魔术方法
'''
	触发时机: 使用print(对象)或者str(对象)的时候触发
	功能:     查看对象
	参数:     一个self接受当前对象
	返回值:   必须返回字符串类型
'''
#__repr__ 魔术方法
'''
	触发时机: 使用repr(对象)的时候触发
	功能:     查看对象,与魔术方法__str__相似
	参数:     一个self接受当前对象
	返回值:   必须返回字符串类型
'''
#----普通变量的基本操作,如果应用在对象上,也有相应的魔术方法

#__bool__ 魔术方法
'''
	触发时机:使用bool(对象)的时候自动触发
	功能:强转对象
	参数:一个self接受当前对象
	返回值:必须是布尔类型
'''
'''
类似的还有如下等等(了解):
	__complex__(self)      被complex强转对象时调用
	__int__(self)          被int强转对象时调用
	__float__(self)        被float强转对象时调用
	...
	...
'''
#__add__ 魔术方法  (与之相关的__radd__ 反向加法)
'''
	触发时机:使用对象进行运算相加的时候自动触发
	功能:对象运算
	参数:二个对象参数
	返回值:运算后的值
'''
'''
类似的还有如下等等(了解):
	__sub__(self, other)           定义减法的行为:-
	__mul__(self, other)           定义乘法的行为:
	__truediv__(self, other)       定义真除法的行为:/
	...
	...
'''
#__len__ 魔术方法
'''
	触发时机:使用len(对象)的时候自动触发 
	功能:用于检测对象中或者类中某个内容的个数
	参数:一个self接受当前对象
	返回值:必须返回整型
'''
'''
类似的还有如下等等(了解):
	__iter__(self)                 定义迭代容器中的元素的行为
	__reversed__(self)             定义当被 reversed() 调用时的行为
	__contains__(self, item)       定义当使用成员测试运算符(in 或 not in)时的行为
	...
	...
'''
-多态:不同的子类对象,调用相同的父类方法,产生不同的执行结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值