面向对象编程-总复习(代码片段)

masterjian924 masterjian924     2022-12-22     572

关键词:

面向对象基础

面向对象编程

面向过程编程:类似于工厂的流水线

  • 优点:逻辑清晰
  • 缺点:扩展性差

面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互

  • 优点:扩展性强
  • 缺点:逻辑非常乱

类与对象

  • 对象:属性和方法的集合体

  • 类:一系列相同属性和方法的集合体

现实世界中先有对象后有类,python中先有类,再实例化出对象

对象的属性的查找顺序

先对象本身-->类-->父类-->父类的父类-->object-->自己定制的元类-->type

给对象定制独有属性

class People:
    pass

p1 = Peolple()
p1.name = 'nick'

p2 = People()
p2.name = 'tank'

对象的绑定方法

class People:
    def eat(self):
        print(self, 'eat....')

p1 = Peolple()
p1.eat() 
p1.name = 'nick'

p2 = People()
p2.eat()
p2.name = 'tank'

类与数据类型

lis = [1,2,3]  # lis = list([1,2,3])

class foo:
    def __init__(self,name):
        self.name = name

f = foo('name')

lis.append(4)  # 对象调对象绑定的方法,会自动传参
list.append(lis,4)  # 类调用对象绑定的方法,必须得传参

面向对象进阶

类的继承

继承父类,则会有父类的所有属性和方法

class ParentClass1():
    pass
    
class ParentClass2():
    pass

class SubClass(ParentClass1,ParentClass2):
    pass

类的派生

继承父类的同时自己有init,然后也需要父类的init

class ParentClass1():
    def __init__(self,name):
        pass
    

class SubClass(ParentClass):
    def __init__(self,age):
        # 1. ParentClass1.__init__(self,name)
        # 2. super(SubClass,self).__init__(name)
        self.age = age  

类的组合

类对象可以引用/当做参数传入/当做返回值/当做容器元素,类似于函数对象

class ParentClass1():
    count = 0
    def __init__(self,name):
        pass

class SubClass(ParentClass):
    def __init__(self,age):
        self.age = age  

pc = ParentClass1()
sc = SubClass()

sc.parent_class = pc  # 组合
sc.parent_class.count  # 0

菱形继承问题

新式类:继承object的类,python3中全是新式类

经典类:没有继承object的类,只有python2中有

在菱形继承的时候,新式类是广度优先(老祖宗最后找);经典类深度优先(一路找到底,再找旁边的)

多态与多态性

一种事物的多种形态,动物-->人/猪/狗

# 多态
import abc

class Animal(metaclass=abc.ABCmeta):
    @abc.abstractmethod
    def eat():
        print('eat')

class People(Animal):
    def eat():
        pass

class Pig(Animal):
    def eat():
        pass
    def run():
        pass

class Dog(Animal):  # 报错
    def run():
        pass
        
# 多态性
peo = People()
peo.eat()
peo1 = People()
peo1.eat()
pig = Pig()
pig.eat()

def func(obj):
    obj.eat()

class Cat(Animal):
    def eat():
        pass
cat = Cat()

func(cat)

鸭子类型:只要长得像鸭子,叫的像鸭子,游泳像鸭子,就是鸭子.

类的封装

隐藏属性,只有类内部可以访问,类外部不可以访问

class Foo():
    __count = 0 
    
    def get_count(self):
        return self.__count
        
f = Foo()
f.__count  # 报错
f._Foo__count # 不能这样做

类的property特性

把方法变成属性引用

class People():
    def __init__(self,height,weight):
        self.height = height
        self.weight = weight
    
    @property
    def bmi(self):
        return weight/(height**2)
        
    @bmi.setter
    def bmi(self,value)
        print('setter')
        
    @bmi.deleter
    def bmi(self):
        print('delter')

peo = People
peo.bmi

类与对象的绑定方法和非绑定方法

没有任何装饰器装饰的方法就是对象的绑定方法, 类能调用, 但是必须得传参给self

被 @classmethod 装饰器装饰的方法是类的绑定方法,参数写成cls, cls是类本身, 对象也能调用, 参数cls还是类本身

被 @staticmethod 装饰器装饰的方法就是非绑定方法, 就是一个普通的函数

面向对象高级

isinstance,issubclass

isinstance判断是否为类的实例化对象,会检测父类,而type不会检测父类

issubclass,判断是否为其子类

反射

  1. hasattr:通过字符串判断是否类属性存在
  2. getattr:通过字符串获取类属性
  3. setattr:通过字符串修改类属性
  4. delattr:通过字符串删除类属性

call

class Foo:
    def __init__(self):
        print('Foo()会触发我')
    def __call__(self):
        print('Foo()()/f()会触发我')

f = Foo()
f()

new

class Foo:
    def __new__(self):
        print('new')
        obj = object.__new__(self)
        return obj
    
    def __init__(self):
        print('init')
        
f = Foo()

元类

元类用来造类的

元类()-->类-->init

元类()()-->对象--->call

类分为几部分:类名/类体名称空间/父类们

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dic):
        # 控制类的逻辑代码
        super().__init__(class_name,class_bases,class_dic)
    
    def __call__(self,*args,**kwargs):
        # 控制类实例化的参数
        
        obj = self.__new__(self)  # obj就是实例化的对象
        self.__init__(obj,*args,**kwargs)
        print(obj.__dict__)
        
        # 控制类实例化的逻辑
        
        return obj
    
class People(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age

单例模式

利用类的绑定方法的特性

NAME = 'nick'
AGE = 18

class People():
    
    __instance = None
    
    @classmethod
    def from_conf(cls):
        if cls.__instance:
            return cls.__instance
        
        cls.__instance = cls(NAME,AGE)
        return cls.__instance

People.from_conf()

People.from_conf()

利用装饰器

NAME = 'nick'
AGE = 18

def deco(cls):
    cls.__instance = cls(NAME,AGE)
    
    def wrapper(*args,**kwargs):
        if len(args) == 0 and len(kwargs) == 0:
            return cls.__instance
        
        res = cls(*args,**kwargs)
        return res
    
    return wrapper

@deco
class People():
    def __init__(self,name,age):
        self.name = name
        self.age = age

peo1 = People()

peo2 = People()

利用元类(正宗的)

NAME = 'nick'
AGE = 18

class Mymeta(type):
    def __init__(self,class_name,class_bases,class_dict):
        super().__init__(class_name,class_bases,class_dict)
        self.__instance = self(NAME,AGE)
     
    def __call__(self,*args,**kwargs):
        
        if len(args) == 0 and len(kwargs) == 0:
            return self.__instance
        
        obj = object.__new__(self)
        self.__init__(obj,*args,**kwargs)
        
        return obj
    
class People(metaclass=Mymeta):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
peo1 = People()
peo2 = People()

异常处理

捕捉异常

x = 10
y = 20
c = 30

try:
    1/0
except Exception as e:
    print(e)

raise

抛出异常

raise KeyboardInterrupt('中断捕捉')

assert

判断某一行代码是否有问题

穷吉201771010119总复习(代码片段)

...与要求(1)综合掌握java基本程序结构;(2) 综合掌握java面向对象程序设计特点;(3)综合掌握javaGUI 程序设计结构;(4)综合掌握java多线程编程模型;(5)综合编程练习。2、实验内容和步骤任务1:填写课程课后调查问卷,网址:... 查看详情

复习第八天(代码片段)

1.面向对象思想编程内容的三条主线分别是什么①类及类的成员:属性、方法、构造器;代码块、内部类②面向对象的三大特征:封装、继承、多态③其它关键字:this,super,abstract,interface,static,final,package,import面向... 查看详情

复习第八天(代码片段)

1.面向对象思想编程内容的三条主线分别是什么①类及类的成员:属性、方法、构造器;代码块、内部类②面向对象的三大特征:封装、继承、多态③其它关键字:this,super,abstract,interface,static,final,package,import面向... 查看详情

实验十八总复习(代码片段)

...目的与要求(1)综合掌握java基本程序结构;(2)综合掌握java面向对象程序设计特点;(3)综合掌握javaGUI程序设计结构;(4)综合掌握java多线程编程模型;(5)综合编程练习。2、实验内容和步骤任务1:填写课程课后调查问卷,网址:https:... 查看详情

javascript基础复习(代码片段)

...之间请求问题3.JavaScript采用【弱类型编程语言风格】对【面向对象思想】来进行实现的编程语言二.弱类型编程语言风格VS强类型编程语言风格1.强类型编程语言风格:认为对象行为应该受到其修饰类型严格约束.Java采用【强类... 查看详情

王之泰《面向对象程序设计(java)》课程学习总结(代码片段)

...境配置(第1章、第2章)2.Java基本程序结构(第3章)3.Java面向对象程序结构(第4章、第5章、第6章)4.类、类间关系、类图5.JavaJDK预定义类/接口及其API(String-第3章、Arrays-第3章、Files-第3章62页、LocalDate-第4章、Object-第5章、对象... 查看详情

201771010130王志成《面向对象程序设计(java)》第十八周学习总结(代码片段)

...境配置(第1章、第2章)2.Java基本程序结构(第3章)3.Java面向对象程序结构(第4章、第5章、第6章)4.类、类间关系、类图5.JavaJDK预定义类/接口及其API(String-第3章、Arrays-第3章、Files-第3章62页、LocalDate-第4章、Object-第5章、对象... 查看详情

p1总复习(代码片段)

目录计算机之编程计算机组成原理计算机之操作系统编程语言变量内存管理数据类型用户交互input格式化输出基本运算符流程控制数据类型的内置方法计算机之编程什么是编程语言人与计算机交互的介质什么是编程人通过编程语... 查看详情

复习面向对象---员工案例(代码片段)

Employee.javapackagecom.yikuan.cn;/***定义员工类,内容:都是所有子类的共性抽取,姓名、工号、工作方法*@authorAdministrator**/publicabstractclassEmployee/*姓名*/privateStringname;/*工号*/privateStringID;/*定义工作方法,由于工作内容不同,所有定义... 查看详情

java基础编程篇(4.面向对象上)(代码片段)

...言尚硅谷-Java课程-笔记(用于自己复习)终于把面向对象看完了🤣,总结一下,基础篇就结束啦~一、类与对象1.面向对象学习的三条主线Java类及类的成员:属性、方法、构造器;代码块、内部类面向... 查看详情

java面向对象复习(代码片段)

文章目录一、类和对象1.面向对象2.类的定义3.对象的创建4.类在内存中的存储5.类的成员使用6.toString()方法7.static关键字静态成员变量静态成员方法二、封装1.构造方法概念基本使用构造方法的重载this关键字2.private3.封装的好处三... 查看详情

java自用基础编程篇-4.面向对象(中)(代码片段)

...言尚硅谷-Java课程-笔记(用于自己复习)以下是面向对象(中)的内容🤣一、面向对象的特征二:继承性1.为什么要有类的继承性?(继承性的好处)①减少了代码的冗余,提高了代码的复用性... 查看详情

java知识面试题复习java面向对象(代码片段)

面向对象面向对象概述面向对象和面向过程的区别面向过程:优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发࿰... 查看详情

java知识面试题复习java面向对象(代码片段)

面向对象面向对象概述面向对象和面向过程的区别面向过程:优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发࿰... 查看详情

软考面向对象程序设计复习指南(代码片段)

...考纲(1)分析模式与设计模式知识(2)面向对象程序设计知识(3)用C++语言实现常见的设计模式及应用程序。(4)用Java语言实现常见的设计模式及应用程序。2、面向对象基本概念面向对象... 查看详情

c#复习笔记3(代码片段)

面向对象编程:类和对象(二)以对象为成员静态成员:描述类的整体特征的量可以用静态变量实现。静态变量在内存中只有一份,为类的所有对象共享。C#对象初始化classtest:IEquatable<test>publicintaaget;set;pub... 查看详情

如何在单片机中使用面向对象编程的思想?(代码片段)

...砌,很空泛。那么这个时候,你也许应该在单片机中引入面向对象的思 查看详情

cgbtn2110-day06总结复习(代码片段)

DAY06复习1.面向过程:这种编程思想强调的是过程,凡事亲力亲为2.面向对象:这种思想强调的是结果,Java就是一门面向对象的语言不在意完成的过程,在意的是有对象可以帮我干活比如:我们想吃饭,... 查看详情