# 面向对象继承的主要作用是 # 优化代码,节省代码. # 提高代码的复用性. # 提高代码的维护性. # 让类与类之间发生关系. # 例: class Parent: def __init__(self): self.func() def func(self): print('Parent') class Son(Parent): def __init__(self): self.func() def func(self): print('Son') son1 = Son() # result:Son,继承中优先使用派生类中的方法 class A: lst = [] p1 = A() p2 = A() p1.lst.append(1) print(p1.lst,p2.lst,A.lst) # result:[1] [1] [1],列表是可变数据类型,这里可以参考函数默认值使用的都是同一块内存地址 class A: name = 'Tian' p1 = A() p2 = A() p1.name = 'wuser' print(p1.name,p2.name,A.name) # result:wuser Tian Tian str类型是可hash的对象只能访问类的静态字段无法修改
# python中是没有接口这个概念的 # 接口类,抽象类: 制定一个规范。 # 归一化设计 class Alipay: def __init__(self,money): self.money = money def pay(self): print('支付了%s' %self.money) class Jdpay: def __init__(self,money): self.money = money def pay(self): print('支付了%s' %self.money) apay = Alipay(100) jpay = Jdpay(200) apay.pay() jpay.pay() # 支付是一个统一的概念,这里明显无法统一,那如何实现统一 def pay(obj): obj.pay() pay(apay) # 这样是不是看起来统一了,这就是归一化设计抽象类也是借鉴了这个概念
from abc import ABCMeta,abstractmethod class Payment(metaclass=ABCMeta): #装饰器 制定一个规范当派生类缺失pay方法时会报错 @abstractmethod def pay(self): pass # 制定了一个规范 class Alipay(Payment): def __init__(self,money): self.money = money def pay(self): print('支付了%s' %self.money) class Jdpay(Payment): def __init__(self,money): self.money = money # def pay(self): # print('支付了%s' %self.money) apay = Alipay(100) jpay = Jdpay(200) # result:TypeError: Can't instantiate abstract class Jdpay with abstract methods pay
# python中没有多态的概念,但他有鸭子类型 # class Str: # def index(self): # pass # class List: # def index(self): # pass # # class Tuple: # def index(self): # pass # 当三个类中的方法相同时我们称其为鸭子类型
# 广义的封装: 实例化一个对象,给对象空间封装一些属性. # 狭义的封装: 私有制. # 私有成员:私有静态字段,私有方法,私有对象属性 class A: # 这就是A类的私有静态字段只有在A类内部调用时才能访问,外部无论是派生类还是实例都无法访问 __money = 1000 a1 = A() # print(a1.__money) # print(A.__money) # 报错,这里有个bug因为python设计的时候会在私有字段前面加类名 print(a1._A__money) # 这是python设计问题没有人会这么用 class Parent: def __func(self): print('in Parent func') def __init__(self): self.__func() class Son(Parent): def __func(self): print('in Son func') son1 = Son() # result:in Parent func
class Person: def __init__(self,name,sex,age): self.__name = name self.__sex = sex self.age = age def func(self): print(self.__name) p1 = Person(1,2,3) # print(p1.__name) 报错 p1.func() # 在类内部执行__name时他会在前面添加_Person