方法没有重载
python方法没有重载
其他语言同名方法,形参列表来区分
python参数类型没有区分所以无需重载
定义多个重名方法只有最后一个有效
方法的动态性
可以动态的为类添加新方法
方法也是对象 函数也是对象 一切都是对象
私有属性和私有方法python
python对于类的成员没有严格的访问控制限制,
两个下划线开头的属性是私有的
类内部可以访问私有属性(方法)
类外部不能直接访问私有属性(方法)
来歪不可以通过_类名__私有属性(方法)名 访问私有属性(方法)
注:方法本质上也是属性
class Employee:
def __init__(self,name,age):
self.name = name
self.__age = age
e = Employee("yzy",18)
print(e.name)
print(e._Employee__age) #访问私有属性
__方法名 是私有方法 调用时也用_类名__私有方法()
类变量也可以私有 __类变量名
@property装饰器
可以将方法的调用方式变为属性调用
只能调用方法 但不能设置方法 得到get set方法
继承
python继承,支持多重继承,一个子类继承多个父类,object是所有类的父类 ,里面定义了一些所有类的共有的默认实现
定义子类时必须在定义构造函数时调用父类的构造函数
父类名.__init__(self,参数)
必须显式的调用父类初始化方法,不然解释器不会去调用
私有的方法和属性子类继承不能直接用,如果要用需要s._父类名__属性名
dir()查看对象的所有属性
类成员的继承和重写
成员继承:子类继承了父类除构造方法之外的所有成员
方法重写,子类可以重新定义父类中的方法,就会覆盖父类的方法,也称为重写
通过类的方法mro() 或者类的属性__mro_可以输出这个类的继承层次结构
object类是所有类的父类
dir() 内置函数查看对象的所有属性
多重继承
aaa 一个子类可以有多个直接父类,不便于维护,避免使用
mro()
如果父类中有相同名字的方法,在子类没有指定父类名是,解释器将从左向右按顺序搜索
mro方法解析顺序,通过广度优先算法
super()获得父类定义
在子类中,想要获得父类的方法时,使用super()
多态
同一个方法调用由于对象不同可能会产生不同的行为
多态是方法的多态,属性没有多态
多态的方法有两个必要条件:继承,方法重写
class Man:
def eat(self):
print("饿了,吃饭“)
class Chinese(Man):
def eat(self):
print("中国人用筷子")
class English(Man):
def eat(self):
print(”英国人用叉子“)
def manEat(m):
if isinstance(m,Man): #如果参数object是classinfo的实例,或者object是classinfo类的子类的一个实例, 返回True
m.eat()
else:
print("bunengchifan")
manEat(Chinese())
manEat(English()) #传参数是Man的子类实例,传的不一样,输出不一样
特殊方法和运算符重载
每个运算法实际上都对应了相应的方法 + : __add__ 等等
浅拷贝 深拷贝
一般都是浅拷贝 对象包含的子对象内容不拷贝,原对象和拷贝对象会引用同一个子对象
变量的赋值操作只是形成两个变量,实际还是指向同一个对象
组合
is-a关系 继承
has-a 组合 也能实现一个类拥有另一个类的方法和属性
都可以起到代码复用的作用
class A2:
def say_a2(self):
print("a2")
class B2:
def __init__(self,a):
self.a = a
a2 = A2()
b2 = B2(a2)
b2.a.say_a2()
设计模式:工厂模式
工厂模式实现了创建者和调用者的分离,使用专门的工厂类将选择实现类、创建对象进行同一的管理和控制
设计模式实现分离 实现分工
实现各个类单独拿出来,创建不同类的对象合并到工厂类的函数里面
单例模式
核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点
单利模式之声吃一个实例对象,减少了对系统资源的的开销