一、方法的重载
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)