继承

子类可以有父类的功能,也可以有父类的父类的功能

重写

当子类不需要父类的一个方法的实现时,可以重写一个方法,方法名必须和父类相同

子类的方法和父类的方法相同的时候,会先去自己的类中找,找到了就用自己的,找不到去父类找

调用被重写的方法

第一种调用被重写的父类的方法
父类名.方法名(self)
第二种
super().方法名()

私有方法和私有属性并不会被继承

如果调用的是继承的父类的共有方法,可以在这个共有方法里访问父类的私有方法和属性

但是如果在子类中实现了一个共有方法,那么这个方法是不能够调用继承的父类中的私有方法和私有属性

多继承

object是所有类的基类,继承object的类是新式类,python3默认继承,所以都是新式类

多继承查找顺序

c3算法,类名.__mro__   决定调用一个方法时,搜索的顺序,如果在某个类中找到了方法,那么就停止搜索

多态

python崇尚鸭子类型,所谓多态,就是定义时的类型和运行时的类型不一样,此时就称为多态

定义时不知道调谁,执行的时候才知道调谁

class Dog(object):def print_self(self):print('大家好,我是xxx')class Xiaobai(Dog):def print_self(self):print('hello everybody')def introduce(temp):temp.print_self()dog1=Dog()
dog2=Xiaobai()introduce(dog1)
introduce(dog2)

实例属性:和具体的某个实例对象有关系

并且一个实例对象和另外一个实例对象是不共享属性的

类属性:类属性所属于类对象

并且多个实例对象之间共享一个类属性

实例属性是对象的属性,如在__init__里的属性就是实例属性

类属性是类的属性,在def外面定义的属性叫做类属性

类方法、实例方法、静态方法

class Game(object):#类属性num=0#实例方法def __init__(self):#实例属性self.name='laowang'#类方法
    @classmethoddef add_num(cls):cls.num=100#静态方法,和类对象和实例对象都没有关系的方法
    @staticmethoddef print_menu():print('-----')print('开始')print('结束')print('-----')game=Game()
Game.add_num()#可以通过类名调用类方法
# game.add_num()还可以通过这个类创建出来的对象去调用这个类方法
print(Game.num)
Game.print_menu()#通过类调用静态方法
# game.print_menu()#通过实例对象调用静态方法

在一个类中定义一个方法返回另一个类的对象

class CarStore(object):def order(self,money):if money>5000:return Car()class Car(object):def move(self):print('车在移动')def music(self):print('车在听音乐')def stop(self):print('车在停止')
car_stone=CarStore()
car=car_stone.order(10000)
car.move()
car.music()
car.stop()

耦合性,关联太强,添加一辆车要去类中修改,删除一辆车也是
class CarStore(object):def order(self,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 Mingtu(Car):pass
class Suonata(Car):print('haha')
car_stone=CarStore()
car=car_stone.order('索纳塔')
car.move()
car.music()
car.stop()

定义一个额外的函数达到解耦的状态

#def select_car_by_type(car_type):# 功能:返回一个汽车对象的引用# 参数:需要得到汽车的类型
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 Mingtu(Car):pass
class Suonata(Car):print('haha')
car_stone=CarStore()
car=car_stone.order('索纳塔')
car.move()
car.music()
car.stop()

简单工厂模式
# 定义一个类达到类之间的分离的状态
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(self,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 Mingtu(Car):pass
class Suonata(Car):print('haha')
car_stone=CarStore()
car=car_stone.order('索纳塔')
car.move()
car.music()
car.stop()

简单工厂模式,虽然代码可能运行错误,但是大概是这么个意思

# 基类定义流程,但不实现,交给子类实现
class Store(object):def select_car(self,car_type):passdef order(self,car_type):return self.select_car(car_type)
class BMWCarStore(Store):def select_car(self,car_type):return BMWFactory().select_car_by_type(car_type)bmw_store=BMWCarStore()
bmw=bmw_store.order('123')
# 简单工厂模式
# 定义一个类达到类之间的分离的状态
class CarStore(Store):def select_car(self,car_type):return Factory().select_car_by_type(car_type)class BMWFactory(object):def select_car_by_type(self,car_type):passclass Factory(object):def select_car_by_type(self,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 Mingtu(Car):pass
class Suonata(Car):print('haha')
car_stone=CarStore()
car=car_stone.order('索纳塔')
car.move()
car.music()
car.stop()

__new__,作用是创建一个对象,__init__负责初始化,两个方法合起来做的事就是构造方法做的事

class Dog(object):def __init__(self):print('init方法')def __new__(cls, *args, **kwargs):print('构造方法')return object.__new__(cls)#重写new时必须返回父类的new方法,不然创建不了实例对象def __del__(self):print('del方法')def __str__(self):print('str方法')return '描述信息'
xtq=Dog()
# 做了三件事
# 1、调用__new__方法来创建对象,然后找了一个变量来接收__new__的返回值,这个返回值表示创建出来的对象的引用
# 2、__init__(刚刚创建出来的对象的引用)
# 3、返回对象的引用

单例模式

参考我的博客https://www.cnblogs.com/z-x-y/p/10068512.html

单例模式实现了只能创建一个实例对象,但是能初始化很多次,我们怎么实现只初始化一次对象呢

class Dog(object):

    __instance=None    __init_flag=False

    def __new__(cls, name):        if not cls.__instance:            cls.__instance=super().__new__(cls)        return cls.__instance

    def __init__(self,name):        if Dog.__init_flag==False:            self.name=name            Dog.__init_flag=True

a=Dog('旺财')print(id(a))print(a.name)b=Dog('哮天犬')print(id(b))print(b.name)

转载于:https://www.cnblogs.com/z-x-y/p/10094478.html

面向对象2(待补充)相关推荐

  1. 判读一个对象不为空_LabVIEW面向对象编程_初窥门径(3):开发实践

    本篇文章主要讲解在前文面向对象设计原则(SOLID)后,如何应用这些原则形成的LVOOP中HAL(Hardware Abstraction Layer)和MAL(Measurement Abstrac ...

  2. 面向对象程序设计六大原则

    面向对象程序设计中,需要遵守的原则可总结为6个,这就是大名鼎鼎的六大原则.面向对象程序设计原则也是我们用于评价一个设计模式的重要指标之一.在设计模式中,很多设计模式都遵守了这些原则. 单一职责原则(S ...

  3. 【AJAX】JavaScript的面向对象

    Ajax中后端数据返回后需要前端通过JavaScript来实现动态数据更新的问题.所以,在Ajax中加深了一遍JavaScript面向对象的印象. 基础部分: JavaScript中创建对象并简单对象 ...

  4. 面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

    AutoSAR入门到精通系列讲解 将从2019年开始更新关于AutoSAR的知识,从入门到精通,博主xyfx和大家一起进步 雪云飞星 ¥29.90 去订阅 简单地说结构化分析方法主要用来分析系统的功能 ...

  5. 2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

    目录 scala面向对象 MAVEN依赖 类 - 掌握 创建类和对象 - 掌握 getter/setter - 了解 类的构造器 - 掌握 scala面向对象 MAVEN依赖 <?xml ver ...

  6. php面向对象程序设计,PHP面向对象程序设计类的定义与用法简单示例

    本文实例讲述了PHP面向对象程序设计类的定义与用法.分享给大家供大家参考,具体如下: class Person { private $name; private $sex; private $age; ...

  7. java面向过程和面向对象

    面向过程(Procedure Oriented):说的是功能的行为 面向对象(Object Oriented,简称OO):说的是功能的对象 面向过程理解: 当学习java的时候先了解java语言优良的 ...

  8. day22_面向对象

    面向过程: 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 面向对象: 优点是:解决了程序的扩展性.对 ...

  9. java面向对象-------静态初始化块

    1.构造方法用于对象的初始化!静态初始化块,用于类的初始化操作,在静态初始化块中不能直接访问非static成员. package java面向对象; /** * 测试静态初始化块 */public c ...

最新文章

  1. sqlyog.err文件可以删掉吗_苹果备忘录删掉的东西可以找回来吗?可以恢复被删内容的便签备忘录软件...
  2. XenApp_XenDesktop_7.6实战篇之十四:XenDesktop虚拟桌面的交付
  3. 给GridView中的buttonField添加一个删除确认功能
  4. java 时间转中文_使用JScript把时间转成中文
  5. 信息学奥赛C++语言:可口可乐
  6. java实现背包问题例子_动态规划(背包问题)java实现
  7. MATLAB学习笔记(七)——MATLAB解方程与函数极值
  8. WebLogic中如何设置Spring Boot项目的属性
  9. python的文件夹_Python文件夹与文件的操作
  10. python自我复制的程序_Python自我
  11. shell基础之99乘法表
  12. 2021年好看高考倒计时源码
  13. matlab去高斯噪声,[转]MATLAB信号中高斯噪声
  14. GAN的评价指标——KID解读(内含FID)
  15. 如何听清楚、说明白--《结构思考力》
  16. 联诚发龙显P1.25系列LED大屏亮相宝安区区政府会议室
  17. 打印出ntdll.dll中所有函数名字和地址
  18. AutoLayout的使用
  19. 如何做一个炫酷的动画网站-css实现图片上下浮动效果
  20. Jade 6.0的使用

热门文章

  1. “寒门状元之死”文章引热议 京东徐雷:三流文学作品 多看书吧
  2. __FILE__, __LINE__, __FUNCTION__
  3. 为什么MediaPlayer中onCompletion()每次播放音频时都触发?
  4. java播放声音类和一个简单示例
  5. 前端md转html添加样式_前端文档站点搭建方案
  6. Android studio中提交svn一直卡在performing VCS commit
  7. Golang实践录:使用gin框架实现转发功能:利用nginx转发
  8. ffmpeg 2.6.3在Linux下的编译
  9. [Linux网络编程]ARP简单实例
  10. 【clickhouse】 clickhouse配置查询记录query_log