Python学习第八节

本文深入探讨了Python的面向对象编程特性,包括方法的动态性、私有属性和方法的封装、@property装饰器的使用,以及继承、多态等核心概念。还介绍了特殊方法和运算符重载,以及在实际编程中常用的设计模式——工厂模式和单例模式。
摘要由CSDN通过智能技术生成

一、方法的重载

在这里插入图片描述

class AA:
    def Aa(self):
        print("ABC")

    def Aa(self,a): # 默认执行这个方法
         print("abc")

BB = AA()
BB.Aa() # 不带参会报错,默认值执行最后一个方法

在这里插入图片描述
默认执行最后一个方法:

class AA:
    def Aa(self):
        print("ABC")

    def Aa(self,a): # 默认执行这个方法
         print(a)

BB = AA()
# BB.Aa() # 不带参会报错,默认值执行最后一个带参方法
BB.Aa("你好") # 执行带参方法

在这里插入图片描述

1、方法的动态性

在这里插入图片描述

class AA:

    def Aa(self):
        print("ABC")

    def aA(self,a):
         print(a)

def Bb(a):
    print("大家好")

BB = AA()
BB.Aa()
AA.Aa = Bb # 将Bb方法的地址给到了Aa方法里改写了Aa方法
BB.Aa() # 输出改写后的Aa方法

在这里插入图片描述

二、私有属性和私有方法(实现封装)

在这里插入图片描述

class AA:

    def __init__(self,a ,b):
        self.__va = a * 2 # 私有属性:双下划綫 + 标识符
        self.vb = b * 2
        print(a, b)

B = AA(1,2)
print(B.vb)
print(B.__va)

在这里插入图片描述
注:无法直接访问到 __va属性,应改为以下方法:

class AA:

    def __init__(self,a ,b):
        self.__va = a * 2 # 私有属性:双下划綫 + 标识符
        self.vb = b * 2
        print(a, b)

B = AA(1,2)
print(B.vb)
print(B._AA__va) # 下划线 + 类名 + 双下划綫 + 私有属性

在这里插入图片描述

1、私有方法
class AA:

    def __init__(self,a ,b):
        self.__va = a * 2 # 私有属性:双下划綫 + 标识符
        self.vb = b * 2

    def __Aa(self): # 私有方法
        print("SSS")

B = AA(1,2)
B._AA__Aa() # 调用方法和私有属性一样

在这里插入图片描述

2、类内部调用私有属性和方法
class AA:

    def __init__(self,a ,b):
        self.__va = a * 2 # 私有属性:双下划綫 + 标识符
        self.vb = b * 2

    def __Aa(self):
        print("SSS")

    def bb(self):
        print(self.__va) # 类内部调用私有属性:self + 私有属性名
        self.__Aa() # 类内部调用私有方法:self + 私有方法名

B = AA(1,2)
B.bb()

在这里插入图片描述

三、@property装饰器

在这里插入图片描述

class AA:

     def __init__(self,a):
         self.__A = a #创建一个私有属性

     def get_A(self): # get方法获取私有属性
         return self.__A

     def set_A(self,a): # set方法设置私有属性
         if 0 < a < 10:
             self.__A = a
         else:
             print("数据超过范围!")
AB = AA(1)
AB.set_A(5) # 调用set方法设置私有属性数值
print(AB.get_A()) # 输出数值

在这里插入图片描述

1、@property:
class AA:

    def __init__(self,a):
        self.__A = a

    @property # 声明property
    def Aa(self):
        return self.__A

    @Aa.setter # 声明对Aa的值设定:方法名.setter。    同理获取就是:方法名.getter
    def Aa(self,a):
        if 0 < a < 10:
            self.__A = a
        else:
            # self.__A = 1
            print("数值超出范围")

BB = AA(1)
BB.Aa = 6 # 设置私有属性__A的值
print(BB.Aa) #输出__A的值
BB.Aa = 11
print(BB.Aa)

在这里插入图片描述

四、面向对象3大特征说明

在这里插入图片描述

五、继承

在这里插入图片描述

1、语法格式

在这里插入图片描述

class AA:
    def __init__(self,a, b):
        self.A = a
        self.__B = b

    def Aa(self):
        print("你好吗?")

class BB(AA): # 继承于AA类,默认拥有父类所有元素(不包括构造方法,私有属性和方法)
    pass

Ba = BB(100,200)
Ba.Aa() # 调用父类Aa()方法
print(Ba.A) # 调用父类共有的属性
print(Ba.B) # 调用父类私有的属性(报错,无法调用)

在这里插入图片描述

六、类成员的继承和重写

在这里插入图片描述

class AA:
    def __init__(self, a, b):
        self.A = a
        self.__B = b

    def aisatsu(self):
        print("你好,我叫{0}".format(self.A))

    def nenrei(self):
        print("我今年{0}岁了".format(self.__B))

class BB(AA):
    def __init__(self, a, b, c):
        AA.__init__(self,a,b) # 使用父类构造方法,并将自己参数传入父类的构造方法内
        self.C = c

    def aisatsu(self): # 重写父类 aisatsu 方法
        print("大家好!我叫{0}".format(self.A))


A = BB("小明", 16, 20)
A.aisatsu()
A.nenrei()

在这里插入图片描述

七、object根类

在这里插入图片描述

class AA:
    pass
class Aa(AA):
    pass
class Ab(Aa):
    pass
class BB(Ab):
    pass

print(BB.mro()) # m属性 mro() 或者 __mro__ 可以输出这个类的继承层次

在这里插入图片描述

1、dir()查看对象属性

在这里插入图片描述

class AA:

    def __init__(self, a, b):
        self.A = a
        self.B = b

    def aa(self):
        print("aa")

class BB(AA):

    def __init__(self,z):
        self.Z = z

    def bb(self):
        print("bb")

Bb = BB("123")
print(dir(BB))
obj = object()
print(dir(obj))
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'aa', 'bb']
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

Process finished with exit code 0

八、str()方法

在这里插入图片描述

class AA:
    def __init__(self,a):
        self.A = a

class BB:
    def __init__(self,b):
        self.B = b

    def __str__(self):
        return "__str__方法用作于对对象的描述信息,可重写"


A = AA(1)
print(A) # 没有__str__方法的对象
B = BB(1)
print(B) # 有__str__方法的对象

在这里插入图片描述

九、多重继承

在这里插入图片描述
在这里插入图片描述

十、super()方法获取父类定义

在这里插入图片描述

class AA:
     def Aa(self):
         print("A:",self)

class BB(AA):
    def Bb(self):
        print("B:",self)
        super().Aa() # 输出父类的定义

BB().Bb()

在这里插入图片描述

十一、多态

在这里插入图片描述

class AA:
    def xr(self):
        print("形容词")

class Aa(AA): # 继承AA
    def xr(self): # 重写
        print("大")
class aa(AA): # 继承AA
    def xr(self): # 重写
        print("小")
class aA(AA): # 继承AA
    def xr(self): # 重写
        print("多")

da = Aa()
xiao = aa()
duo = aA()

da.xr()
xiao.xr()
duo.xr()

在这里插入图片描述

十二、特殊方法和运算符重载

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class AA:

    def __init__(self,a):
        self.A = a

    def __add__(self, other): # 重写__add__()
        if isinstance(other, AA):
            print("{0}——{1}".format(self.A, other.A))
        else:
            print("类对象不相同无法相加!")

class Ab:

    def __init__(self,a):
        self.B = a

aA = AA("大") # aA 和 aa 对象归属于同一个类(AA)
aa = AA("小") # aA 和 aa 对象归属于同一个类(AA)
bB = Ab("多") # bB对象归属于Ab类

aA + aa # 进行加法运算
# aA.__add__(aa) 等同于上面
aA + bB # 不同类的对象进行加法运算

在这里插入图片描述

1、特殊属性

在这里插入图片描述

十三、组合

在这里插入图片描述

class AA:

    def kiku(self):
        print("好像听到有什么动静")

class BB:
    def __init__(self, a):
        self.A = a

B = BB(AA()) # 将实例化对象给到BB类的A属性内
B.A.kiku()   # B.A:调用BB类下的构造方法里的A属性(AA的实例化对象)。 A.kiku() 通过实例化对象调用AA类下的kiku方法

在这里插入图片描述

十四、设计模式

1、工厂模式

在这里插入图片描述

class AA:
    def namae(self, a):
        if a == "张三":
            return zhangsan() # 返回对应的类
        elif a == "李四":
            return lisi() # 返回对应的类
        elif a == "王五":
            return wangwu() # 返回对应的类
        else:
            print("名字不匹配!")

class zhangsan():
    def __init__(self):
        print("你好")

class lisi():
    def __init__(self):
        print("大家好")

class wangwu():
    def __init__(self):
        print("哈啰")

A = AA()
A.namae("张三")
A.namae("老张")

在这里插入图片描述

2、单例模式

在这里插入图片描述

class AA:
    __A = None
    __B = True
    def __new__(cls, *args, **kwargs): # 重写__new__方法
        if cls.__A == None: # 如果为空值则允许将变量给到__A变量里
            cls.__A = object.__new__(cls) # 将新对象赋值给__A变量里
        return cls.__A # 返回__A变量(对象)


    def __init__(self, a):
        if self.__B: # 如果__B等于真,就允许执行构造方法会的内容
            print("123")
            self.A = a
            self.__B = False

A = AA(1) # 每次新生成对象时会执行__new__方法,每次实例化对象时都会执行__init__方法
B = AA(1) # 每次新生成对象时会执行__new__方法,每次实例化对象时都会执行__init__方法
print(A)
print(B)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值