美文网首页
6.面向对象

6.面向对象

作者: 辉神来了 | 来源:发表于2019-06-30 23:40 被阅读0次
编程方式
  • 面向过程:根据业务逻辑从上到下写代码
  • 函数式: 将某项功能代码封装到函数中,日后无需要重复编写,仅很调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强”


什么是面向对象

面向对象就不像面向过程那样按照功能划分了,它所关注的是软件系统有那些参与者,把这些参与者称为对象,找出这些软件系统的参与者也就是对象之后,分析这些对象有那些特征,那些行为,以及对象之间的关系,所以说面向对象的开发核心是对象


什么是类

面向对象编程的2个非常重要的概念:类和对象
类是对象的类型,具有相同的属性和行为食物的统称。类是抽象的,在使用的时候通常会找到这个类的一个具体存在


image.png
image.png
什么是对象

万物皆对象,对象拥有自己的特征和行为


image.png
image.png
类和对象的关系

类是对象的类型,对象是类的实例,类是抽象概念,而对象是一个你能够摸得着,看得到的实体,二者相辅相成,谁也离不开谁


定义类
  • 类由三个部分构成


创建和使用
image.png
类的属性分类
class person():
    '''
        这是一个人类
    '''
    country = '中国'  #声明类属性,并且赋值
    #实例属性通过构造方法来声明
    #self不是关键字,代表的是当前而对象
    def __init__(self,name,age,sex): #构造方法
        #构造方法不需要调用,在实例化的时候自动调用
        # print('我是构造方法,在实例化得时候调用')
        self.name = name  #通过self 创建实例属性,并且赋值
        self.age = age
        self.sex = sex

    #创建普通方法
    def getName(self):
        print('我的名字叫:%s,我来自%s'%(self.name,person.country)) #在方法里面使用实例属性
针对类的属性的一些方法

可以使用点实例化对象名+.来访问对象的属性
也可以使用以下函数的方式来访问属性
getattr(obj, name[, default]):访问对象的属性
hasattr(obj, name) 检测是否存在一个属性
setattr(obj,name, value):设置一个属性,如果属性不存在,会创建一个新属性delattr(obj, name):删除属性
注意:name需要加单引号,obj为实例化对象名称

#通过内置方法访问属性
 print(getattr(people01,'name'))
 print(hasattr(people01,'name'))

 setattr(people01,'name','susan')
 print(people01.name)

 delattr(people01,'name')
 print(people01.name)
内置类属性
  • Python 内置类属性
    __ dict __ :类的属性(包含一个字典,由类的属性名:值组成)实例化类名.dict 返回格式: {'name': 'susan', 'age': 19, 'sex': '男'}
    __ doc : 类的文档字符串(类名). doc __
    __ name :类名.实现方式 类名. name __
    __ bases __:类的所有父类构成元素(包含了一个由所有父类组成的元素) 返回格式:(<class 'object'>,)

name:如果放在Modules模块中,就表示是模块的名字
如果放在Class类中,就表示类的名字
main:模块,xxx.py 文件本身.被直接执行时,对应的模块名就是main了 可以在 if name == "main"
中添加你自己想要的,用于测试的模块,演示模块用法等代码。
作为模块,被别的Python程序导入(import)时,模块名就是文件本身文件名

一个模块被另外一个程序第一次引入时,其主程序将运行,如果我们想在模块被引入时,模块中的某一个程序块不执行,我们可以用name属性来使该程序块仅在该模块自身运行时被执行

继承的概念

在现实生活在,继承一般指的是子女继承父辈的财产,那么在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中可以描述猫和狗都继承自动物,同理,波斯猫和家猫都继承自猫。而斑点狗,泰迪都继承之狗,程序中当我们定义个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称之为基类、父类或超类。子类继承了其父类的所有属性和方法,同时还可以定义自己属性和方法

子类的init()
image.png
多继承
  • Python 中继承的语法格式如下:



    需要注意圆括号中父类顺序,如果继承的父类中有相同的方法名,而在子类中使用时未指定,Python将从左至右查找父类中是否包含方法

重写
类属性和实例属性
  • 属性
    尽量把需要用户传入的属性作为实例属性,而把同类都一样的属性作为类属性,实例属性在每创造一个类是都会初始化一遍,不同的实例属性可能不同,不同实例的类属性都相同
    1.实例属性
    在__init(self)中初始化
    内部调用时都需要加上self
    外部调用时用"对象名".属性名 调用
    2.类属性
    init()里初始化
    在内部用classname.类属性名调用
    外部即可以用classname.类属性名又可以用instancename.类属性名来调用
    3.私有熟悉:
  1. 双下划线__开头:外部不可以通过“对象名.属性名”来访问或者更改实际将其转化为“类名.属性名”
单下划线、双下划线、头尾双下划线说明
  • foo:定义的时特殊方法,类似init()之类的。
  • _foo: 以单下划线开头表示的是protected类型的变量,即保护类型只 能允许其本身与子类进行访问(创建的实例可以访问),不能用于from module import *
  • __foo : 双下划线的表示是私有类似(private)的变量,只能允许这个类本身进行访问了。
创建和使用类

小结

  • 类(Class):用来描述具有相同属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,对象是类的实例
  • 类变量:类变量在整个实例化的对象是公用的,类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量(方法中的变量)用于处理类及其实例对象的相关数据
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法重写
  • 实例变量:定义在方法中的变量只作用于当前实例的类
  • 实例化:创建一个类的实例,类的具体对象
  • 方法:类中定义的函数

访问限制

私有类属性为了保护属性不被随意修改和访问,可以将属性定义为私有属性。
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例变量名如果以 __ 开头,就变成一个私有变量 (private),只有内部可以访问,外部不能访问

访问限制:注意事项
  • 设置为私有属性不能直接通过对象访问属性,但可以通过“实例化对象名.类名__属性名”直接进行访问。但是不建议这样的操作,不同的版本的Python解释器可能会把“ __ 属性名”改成不同的变量,总的来说就是Python本身没有任何机制阻止你干坏事,一切靠自觉
  • 通过“对象名.__属性名”直接修改私有属性
    表面上看好像修改了其实并没有,因为Python解释器已经将对象内部的属性名解释成“类名 __ 属性名”。如果在外部修改相当于另外声明一个属性

能直接修改码? 类属性可以直接通过类名.类名__属性名=(可以通过类方法定义)

类方法和静态方法

类方法和静态方法

  • 普通方法
def fun_name(self,...): 
     passs 

外部调用实例

  • 静态方法:通过装饰器@staticmethod装饰
    不能访问实例属性
    参数不能传入self
    与类相关但是不依赖类与实例的方法
  • 类方法:@classmethod
    不能访问实例属性
    参数必须传入cls
    必须传入cls参数(即代表了此类对象---区别 ---self代表实例对象),并且用此来调用类属性;cls.类属性名

静态方法与类方法都可以通过类或者实例来调用。其两个的特点都是不能够调用实例属性
静态方法不需要接收参数.使用类名.类属性

class person():
  '''
      这是一个人类
  '''
  country = '中国'  #声明类属性,并且赋值
  #实例属性通过构造方法来声明
  #self不是关键字,代表的是当前而对象
  def __init__(self,name,age,sex,address,country): #构造方法
      #构造方法不需要调用,在实例化的时候自动调用
      # print('我是构造方法,在实例化得时候调用')
      self.name = name  #通过self 创建实例属性,并且赋值
      self.age = age
      self.sex = sex
      self.__address = address #双下划线开头的属性是私有属性
      person.country = country
  #创建普通方法
  def getName(self):
      #类属性的使用通过类名.属性名使用 这是规范
      #私有属性在类里面使用正常使用
      print('我的名字叫:%s,我来自%s,我住在%s'%(self.name,person.country,self.__address)) #在方法里面使用实例属性

  #创建一个静态方法
  @staticmethod
  def aa():  #不需要传递实例
      #静态方法不能访问实例属性
      #静态方法只能访问类属性
      print('我的名字叫:%s' % person.country)  

  #类方法
  @classmethod
  def bb(cls,n):  #class  也不是关键字
      #类方法不能访问实例属性
      cls.country = n
      print('我的名字叫:%s' %cls.country )  #就用cls.类属性


#实例化对象
people01 = person('joe',19,'男','上海')

#通过对象来调用静态方
# people01.aa()
#通过对象来调用类方法
# people01.bb()

相关文章

  • 6.面向对象

    编程方式 面向过程:根据业务逻辑从上到下写代码 函数式: 将某项功能代码封装到函数中,日后无需要重复编写,仅很调用...

  • 面向对象总结

    #### 1.什么叫面向对象 2.面向对象的三大特性 3.什么是对象 4.什么是js对象 5.名词提炼法 6.如何...

  • GO学习笔记08

    面向对象 1.匿名组合 2.同名成员 3.非结构体的匿名字段 4.指针类型 5.面向对象和面向过程 6.结构体类型...

  • kotlin学习笔记(二)

    6.面向对象编程 面向对象的语言是可以创建类的。类就是对事物的一种封装,字段表示该类所拥有的属性,函数则表示该类可...

  • 6.面向对象编程 vs 面向过程编程

    1.什么是面向过程编程? 面向过程编程是一种流程化的编程范式或编程风格,通过拼接一组顺序执行的方法操作数据来完成某...

  • 6.面向对象高级部分

    一、static 静态变量 语法: 当需要某个类共享一个变量的时候就可以用静态变量 静态变量随着类加载就初始化了 ...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • 总结.Net基础知识——献给即将入坑的同行们(一期)

    什么是面向对象 面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP; 通俗...

  • 面向对象基础

    面向对象编程包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程实现(OOP) 面向对象思想...

网友评论

      本文标题:6.面向对象

      本文链接:https://www.haomeiwen.com/subject/enpicctx.html