19-面对对象编程
Posted kuoiea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19-面对对象编程相关的知识,希望对你有一定的参考价值。
Object-oriented design 面向对象设计
-
类的定义
-
面向对象编程和函数式编程的区别
-
类的传参
类的定义
? 类是一个抽象的概念,任何东西都可以是一个类,比如,苹果是一个类,香蕉是一个类,动物又是一个类,但是类又不是绝对的,类是一个相对的概念,比如,动物类可以实例化为老虎,可以实例化为狮子,但是,狮子又可以是一个类。所以说类是相对的,不是绝对的。
? 实例化是我们对类的详细描述。将类进行实例化,我们可以得到对象这一概念。
? 对象就是基于类二创建的一个具体的事物(具体存在的)。
? 首先,我们来定义一个类:
class Foo(object):
‘‘‘
函数文档字符
‘‘‘
role = "new_class" #静态变量
def func(self): #动态变量
pass
对于类的定义必须遵循以下结构
class 类名():? 函数体
? 这个是类最基本的结构,其中必须有关键字 class表示这是一个类class后加类名,一般我们对类的命名方法和变量的命名方法要求相同,但是我们约定俗称的是类名的第一个字符使用大写,再python2.7版本之前我们类名之后可以不加括号和object,但是再python3.x版本之中,python加入了新式类的概念,所以一般我们会在类名后面加上括号和object。
面向对象编程的思想
? 不关注程序执行的过程
? 关心的是一个程序中的角色以及角色与角色之间的关系
经典类和新式类
只有在python2中才分新式类和经典类,python3中统一都是新式类
新式类和经典类声明的最大不同在于,新式类必须继承至少一个父类
在所有类中,不管是否显示声明父类都有一个默认继承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所指向的内存空间返回给实例化它的地方
使用这个对象可以找两个东西
对象所在内存空间中存储的东西
类对象指针所指类中的所有方法和静态变量
-
对象着名字的时候,先找自己内存空间中的名字,再找类的
-
对象没有权力修改类中的静态变量和方法
-
用类名操作静态变量(属性)
-
类名:实例化对象 调用静态属性 执行方法
-
交互:对象可以作为参数传递给类中的方法
-
组合:对象可以作为另一个对象的属性 ---->表示一种什么有什么的关系
面向对象的三大特性
-
继承
-
多态
-
封装
? 在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-面对对象编程的主要内容,如果未能解决你的问题,请参考以下文章