OOP-面向对象(二)

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

-封装:对类中成员属性和方法的保护,控制外界对内部成员的访问,修改,删除等操作
私有的: 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)时的行为
	...
	...
''' 
-多态:不同的子类对象,调用相同的父类方法,产生不同的执行结果
posted @ 2021-02-18 16:43  EdenWu  阅读(36)  评论(0编辑  收藏  举报