19-面对对象编程

Posted kuoiea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19-面对对象编程相关的知识,希望对你有一定的参考价值。

Object-oriented programming 面向对象编程

Object-oriented design 面向对象设计

  • 类的定义

  • 面向对象编程和函数式编程的区别

  • 类的传参

类的定义

? 类是一个抽象的概念,任何东西都可以是一个类,比如,苹果是一个类,香蕉是一个类,动物又是一个类,但是类又不是绝对的,类是一个相对的概念,比如,动物类可以实例化为老虎,可以实例化为狮子,但是,狮子又可以是一个类。所以说类是相对的,不是绝对的。

? 实例化是我们对类的详细描述。将类进行实例化,我们可以得到对象这一概念。

? 对象就是基于类二创建的一个具体的事物(具体存在的)。

? 首先,我们来定义一个类:

  
class Foo(object):
   ‘‘‘
  函数文档字符
  ‘‘‘
   role = "new_class"  #静态变量
   def func(self): #动态变量
       pass

对于类的定义必须遵循以下结构

class 类名():? 函数体

? 这个是类最基本的结构,其中必须有关键字 class表示这是一个类class后加类名,一般我们对类的命名方法和变量的命名方法要求相同,但是我们约定俗称的是类名的第一个字符使用大写,再python2.7版本之前我们类名之后可以不加括号和object,但是再python3.x版本之中,python加入了新式类的概念,所以一般我们会在类名后面加上括号和object。

面向对象编程的思想

? 不关注程序执行的过程

? 关心的是一个程序中的角色以及角色与角色之间的关系

经典类和新式类

  1. 只有在python2中才分新式类和经典类,python3中统一都是新式类

  2. 新式类和经典类声明的最大不同在于,新式类必须继承至少一个父类

  3. 在所有类中,不管是否显示声明父类都有一个默认继承object父类

  
#经典类
class Foo:
   pass
?
#新式类
class Foo(object):  #括号中可谓其他父类
   pass
?
#在python3中,上述两种方式都是新式类

 

在类中,我们创建的静态变量和动态变量要怎么进行调用和改变呢。

  
class Foo(object):
   role = "test"
   def test(self):
       test1 = 123
print(Foo.__dict__)   #我们可以通过__dict__方法打印出类中所有包含的方法和变量
print(Foo.__dict__["role"])  #打印出静态变量的值,动态变量也可以这样打印出来。
Foo.__dict__["role"] = 222  #虽然这样可以打印出变量的值,但是却不能对值进行修改,如果这样对值进行修改的话,会报错
#如果我们需要对值进行修改的话我们需要怎样做呢
Foo.role = 222  #对值进行修改
print(Foo.role)  #这种办法同样可以将类的静态\动态变量打印出来,且这种方法较为方便,我们以后经常使用这种办法对值进行操作。

 

组合

继承是一个子类和父类之间的关系,那么组合是一个类与另一个类之间的关系

组合: 表示的是一种什么有什么的关系

当一个类的对象作为了另一个类对象的属性,这样就说这两个类组合了。

组合的意义:独立的对象不能发挥他的作用,必须依赖一个对象。

  
#首先我们先写一个程序认识一下组合
class Teacher(object):
   def __init__(selt,name ,sex,age,birthday)
  self.name = name
       self.sex = sex
       self.sge = age
       self.birthday = birthday
class Birrthday(object):
   def __init__(self,year,month,day)
  self.year = year
       self.month = month
       self.day = day
birthday = Birthday(1997,2,15)  
test = Teacher("kuoiea","man",21,birthday)
print(test.birthday.day)    
#在这个程序中,对象birthday作为一个值传入了类Teacher里面,那么self.birthday就存储了Birthday类的内存地址
#我们就可以通过test.birthday.day获取到birthday里面的日期了

 

初识继承

? python中,一切皆对象....

实例化过程

  
1. 创建一个对象
2. __ init __给对象添加一些属性,对象默认的名字self
3. 将这个self所指向的内存空间返回给实例化它的地方

使用这个对象可以找两个东西

  1. 对象所在内存空间中存储的东西

  2. 类对象指针所指类中的所有方法和静态变量

  1. 对象着名字的时候,先找自己内存空间中的名字,再找类的

  2. 对象没有权力修改类中的静态变量和方法

  3. 用类名操作静态变量(属性)

  4. 类名:实例化对象 调用静态属性 执行方法

  5. 交互:对象可以作为参数传递给类中的方法

  6. 组合:对象可以作为另一个对象的属性 ---->表示一种什么有什么的关系

面向对象的三大特性

  1. 继承

  2. 多态

  3. 封装

? 在python3中,所有的类都会默认继承object类,继承了object的所有类都是新式类,如果一个类没有继承任何父类,那么__ base __这个类就会显示<class ‘object‘>

  
class Foo():
   pass
?
print(Foo.__base__)
?
>>><class ‘object‘>

? python中可以继承多个类。

  
class Foo:pass
class Foo2:pass
?
class test(Foo,Foo2):
   pass

父类:括号里面的都是父类 (基类、超类)

子类:class之后的类就是子类 (派生类)

? 继承父类的前提方法就是自己本身没有同名方法。

? 对象使用名字的顺序:

先找对象自己内存空间中的,再找对象自己类中的,再找父类中的。

self.名字,不要看self当前在哪个类里,要看self到底是谁的对象。

以上是关于19-面对对象编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段9——JS中的面向对象编程

Python 面对对象编程

Python-5 面对对象编程

面对对象编程

浅谈Perl的类包模块与面对对象编程

Python - 面对对象(基础)