方法没有重载,在python中,后面定义的同名方法会覆盖前面的方法
私有属性和私有方法(实现封装)
python对于类的成员没有严格的访问限制。2个下划线开头的属性是私有的,类内部可以访问私有属性,外部不能直接访问,但是可以通过_类名_私有属性名访问
@property装饰器
@property可以将一个方法的调用方式变成“属性调用”,一般用来给属性增加get和set方法
封装,多态,继承
封装:
隐藏对象的属性和细节,只对外提供必要的方法。相当于把细节封装起来,只对外暴露相关调用方法,就比如设计一款手机,设计的细节用户没必要知道。用户只需要用法就可以了。python没有严格的语法级别的访问控制符,更多依靠程序员自觉实现
继承:
继承可以让子类具有父类的特性,提高了代码的重用性
多态:
同一个方法调用对象,由于对象不同,会产生不同的行为。就比如张三的休息是睡觉,李四的休息是玩游戏,程序员的休息是敲代码
继承:
class 子类类名(父类1[,父类2,…]) #一个子类可以继承多个父类。
如果类定义中没有指定父类,则默认父类是object,object是所有类的父类。里面定义了一些所有类拥有的默认实现,比如__new__()
Class Person:
def init(self,name,age):
self.name = name
self._age = age
def say_age(self):
print(“我的年龄”,self._age)
def say_introduce(self):
print(“名字”,self.name)
class Student(Person): # 子类
def init(self,name,age,score):
Person.init(self,name.age)
self.score = score
def say_introduce(self):
“”“重写了父类的方法”“”
print("1")
s = Student(“zhangsan”,16,90)
s.say_age()
s.say_introduce()
mro:输出这个类的继承层次结构
object根类。所有的类都有object的方法和属性。
dir()查看对象属性。
class Person:
def init(self,name,age):
self.name = name
self.age = age
def say_age(self):
print(self.name,“的名字是”,self.age)
obj = object()
print(dir(obj))
s2 = Person(“zhangsan”,18)
print(dir(s2))
我们可以看到s2有一些除object属性之外的其他属性。
重写__str__()方法。
str():返回一个对于对象的描述。
Class Person:
def init(self,name):
self.name = name
p = Person(“zhangsan”)
print§
Class Person:
def init(self,name):
self.name = name
def str(self):
return “name is{}”.format(self.name) #重写
p = Person(“zhangsan”)
print§
多重继承
python支持多重继承,一个子类可以有多个“直接父类”。这样就具备多个父类的特点,但是这样会被类的整体层次搞得很复杂,尽量避免使用
class A:
def aa(self):
print(“aa”)
class B:
def bb(self):
print(“bb”)
class C(B,A):
def cc(slef):
print(“cc”)
mro()
如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将从左向右顺序搜索
super()获得父类的定义
在子类中,如果想获得父类的方法,可以通过super(),super()代表父类的定义,不是父类的对象。
多态:
同一个方法,条用由于对象不同,可能会长生不同的行为。比如:张三的休息是睡觉,李四的休息是玩游戏。
注意:多态指的是方法的多态,属性没有多态。
多态2个必要条件:继承和方法重写
特殊方法和运算符重载
20和30本身就是2个对象,使用a+b的时候,其实就是a.__add__b。其实运算符都是方法,比如+ == add
常见的特殊方法:
运算符的重载:
特殊属性:
Python对象包含了很多双下划线开始和结束的属性,都是特殊属性,有特殊的用法,常见的特殊属性:
组合:
“is-a”关系,我们可以使用继承,从而实现子类拥有父类的方法和属性,类似于狗和动物的关系
“has-a”关系,我们可以使用组合,实现一个类拥有另一个类的方法和属性,类似于手机又cup
设计模式_工厂模式实现和单例模式
GOF23中设计模式。2中最常见的:工厂模式和单例模式
工厂模式:
可以帮助我们实现创建者和调用者的分离,使用专门的工厂类将选择实现类,创建对象进行统一的管理和控制
class CarFactory: #定义一个工厂类,通过工厂类创建车的对象
def creat_car(self,brand):
if bread == “Benz”:
return Benz()
elif brand == “bmw”:
return bmw()
elif brand == “BYD”
return BYD()
else:
return"未知品牌无法创建"
class Benz:
pass
class bmw:
pass
class BYD:
pass
factory = CarFactory():
c1 = factory()
单例模式实现
单例模式核心作用是确保一个类只有一个实例,并且提供一个访问该实例的全局访问点,也就是说只生成一个实例对象,减少了对系统资源的开销,当一个第项的产生需要比较多的资源,可以只产生一个实例。