隐藏属性
一个设置,一个获取,定义方法间接去取变量, 否则可能语法上是通的,但逻辑上有问题。
class Dog: def set_age(self,new_age): if new_age>0 and new_age<=100: self.age = new_age else: self.age = 0 def get_age(self): return self.agedog = Dog()dog.set_age(-10)age = dog.get_age()print(age)
私有方法
class Dog: #私有方法 def __send_msg(self): print("------正在发送短信------") #公有方法 def send_msg(self,new_money): if new_money>10000: self.__send_msg() else: print("余额不足,请先充值,再发送短信") dog = Dog()dog.send_msg(100)
class Dog: passdog1 = Dog()dog2 = dog1del dog1 #数据只有1份,名字可以好几个,指向同一个对象del dog2 #看引用计数是否为0 sys.getrefcount() 测量引用个数比实际大1
继承
父类 基类
子类 派生类 可以拥有父类的功能,也可以拥有父类的父类的功能
class Dog(Animal):
重写
一般不会修改父类,直接修改子类的功能
class Xiaotq(Dog): def bark(self): print("---狂叫---") #第一种调用被重写的父类的方法 #Dog.bark(self) #第二种 super().bark
调用被重写的功能
见上
私有方法私有属性在继承中的表现
class A: def __init__(self): self.num1 = 100 self.__num2 = 200 def test1(self): print("----test1----") def __test2(self): print("----test2----") def test3(self): self.__test2() print(self.__num2)class B(A): passb = B()b.test1()#b.__test2() #私有方法不会被继承print(b.num1)print(b.num2)b.test3 #调用父类的公有方法,执行调用私有属性和方法,让用
多继承
调用,C3算法,有搜索路径,先找c,再找b....
class Base(object): def test(self): print("----Base")class A(Base): def test(self): print("----a")class B(Base): def test(self): print("----b")class C(A,B): def test(self): print("----c")c = C()
新式类和经典类
python3 默认都是新式类,不必添加object
多态
定义的时候不确定它具有哪些功能,等到调用方法时才确定调用父类还是子类的方法
面试
1. python是面向过程还是面向对象呢?
既支持面向过程也支持面向对象
2. python语言面向对象的三个要素是什么?
封装、继承、多态
类属性、实例属性
class Tool(object): #类属性 num = 0 #方法 def __init__(self,new_name): self.name = new_name Tool.num+=1tool1 = Tool("铁锹")tool2 = Tool("工兵铲")tool3 = Tool("水桶")print(Tool.num)
实例方法、类方法和静态方法
#类属性num = 0#实例方法def __init__(self): #实例属性 self.name = "laowang"#类方法@classmethoddef add_num(cls): cls.num = 100#静态方法@staticmethoddef print_menu(): print("-------------") print(" 穿越火线v11.1") print(" 1. 开始游戏") print(" 2. 结束游戏") print("-------------")game = Game()Game.add_num()#可以通过类的名字调用类方法print(Game.num)#还可以通过这个类创建出来的对象 去调用这个类方法Game.print_menu()#通过类 去调用静态方法game.print_menu()#通过实例对象 去调用静态方法
设计4s店类
class CarStore(object): def order(self, car_type): return select_car_by_type(car_type)def select_car_by_type(car_type): #用函数解耦 if car_type=="索纳塔": return Suonata() elif car_type=="名图": return Mingtu()class Car(object): def move(self): print("车在移动...") def music(self): print("车在播放音乐...") def stop(self): print("车在停止...")class Suonata(Car): passclass Mingtu(Car): passcar_store = CarStore()car = car_store.order("索纳塔")car.move()car.music()car.stop()
开发文档select_car_by_type(car_type)功能: 返回一个汽车对象的引用参数:需要得到汽车的类型
class CarStore(object): def __init__(self): self.factory = Factory() def order(self, car_type): return self.factory.select_car_by_type(car_type)class Factory(object): def select_car_by_type(car_type): #用函数解耦 if car_type=="索纳塔": return Suonata() elif car_type=="名图": return Mingtu()class Car(object): def move(self): print("车在移动...") def music(self): print("车在播放音乐...") def stop(self): print("车在停止...")class Suonata(Car): passclass Mingtu(Car): passcar_store = CarStore()car = car_store.order("索纳塔")car.move()car.music()car.stop()
设计模式
为了解决哪一类问题,设计的套路
工厂方法模式
父类定义接口,把基本的流程规定好,子类具体来实现功能
class Store(object): def select_car(self): pass def order(self, car_type): return self.select_car(car_type)class BMWCarStore(object): def select_car(self, car_type): return BMWFactory().select_car_by_type(car_type)bmw_store = BMWCarStore()bmw = bmw_store.order("720li")class Factory(object): def select_car_by_type(car_type): if car_type=="索纳塔": return Suonata() elif car_type=="名图": return Mingtu()class Car(object): def move(self): print("车在移动...") def music(self): print("车在播放音乐...") def stop(self): print("车在停止...")class Suonata(Car): passclass Mingtu(Car): passcar_store = CarStore()car = car_store.order("索纳塔")car.move()car.music()car.stop()
__new__方法
class Dog(object): def __init__(self): print("-----init方法-------") def __del__(self): print("-----del方法-------") def __str__(self): print("-----str方法-------") def __new__(cls):#cls此时是Dog指向的那个类对象 print(id(cls)) print("-----new方法-------") #object.__new__(cls)print(id(Dog))xtq = Dog()
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由python解释器自动提供
__new__必须要有返回值,返回实例化出来的实例,可以return父类__new__出来的实例或者直接object的
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其他初始化的工作,__init__不需要返回值
如果将类比作制造商,__new__方法就是前期的原材料购买环节,__init__就是在原材料的基础上,加工,初始化商品环节
创建单例对象
class Dog(object): __instance = None def __new__(cls): if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instance else: #return 上一次创建对象的引用 return cls.__instancea = Dog()print(id(a))b = Dog()print(id(b))