博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python第五天
阅读量:6909 次
发布时间:2019-06-27

本文共 5387 字,大约阅读时间需要 17 分钟。

隐藏属性

一个设置,一个获取,定义方法间接去取变量, 否则可能语法上是通的,但逻辑上有问题。

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))

 

转载于:https://www.cnblogs.com/wangjinliang1991/p/9898921.html

你可能感兴趣的文章
指针和引用
查看>>
Python应用01 原始Python服务器
查看>>
Android应用程序与SurfaceFlinger服务的关系概述和学习计划
查看>>
WCF WinCE 中 手机端 非字符串型 datetime,int,decimal,double 等等 传递不到WCF端的解决方案...
查看>>
iis6.0 之前版本发布silverlight程序 注意事项
查看>>
SQL SERVER 2008中启用相应的功能
查看>>
Implementing a small Cron service in C# - CodeProject
查看>>
poj-2155(二维树状数组)
查看>>
Spring MVC视图解析器:Spring MVC XmlViewResolver示例
查看>>
Managing Users
查看>>
JavaScript用JQuery呼叫Server端方法
查看>>
REST::Neo4p – PERL版本的”OGM”
查看>>
ORA-19808错误一例
查看>>
DirectShowNet 使用摄像头录像+录音
查看>>
Oracle、SQL Server、MySQL数据类型对比
查看>>
php开n次方
查看>>
eclipse自动补全的设置
查看>>
Delphi的三目运算 ifthen 和iif
查看>>
libcurl多线程超时设置不安全(转)
查看>>
3种web会话管理的方式
查看>>