面向对象编程

面向对象编程

面向过程编程:核心是过程,过程是一步一步的。先干啥,后干啥。

对扩展性要求较低的程序例如:系统内核,git,计算器,等等。

  • 优点:逻辑清晰,复杂问题简单化,流程化
  • 缺点:扩展性差,可维护性差

面向对象编程OOP:核心是对象,对象就是属性和方法的集合体,面向对象编程就是负责调度控制这一堆对象进行交互完成任务。

对扩展性要求高的程序,通常都是直接面向用户的,例如QQ,微信

  • 优点:扩展性强,灵活性,重用性
  • 缺点:逻辑复杂,无法准确预知结果

类与对象

  • 对象:属性和方法的集合体
  • 类:类型,是一系列具有相同属性和方法的对象的集合

类中包含一系列对象,对象属于类。

现实世界中先有对象后有类,python中先有类,再实例化对象。在写项目时,先思考对象的属性和技能,再定义类。

定义类和对象:

类在定义阶段,会运行代码

class 类名:(类名首字母大写)
	# 属性用变量来表示
    # 技能用函数来表示
# 类名称 书写名称  首先是见名知意 名称是大驼峰命名法
# 驼峰就是单词首字母大写,大驼峰是第一个字母大写,小驼峰是第一个字母小写
# 类名加括号进行调用
# 类名()  # 实例化对象
# res = 类名()
# res可以使用.调用属性

属性的写法:

属性可以写在类中
类中的属性,是所有对象公共的

也可以写在对象中
对象中的属性,是每个对象的独特属性

如果类中和对象中存在同样的属性,先访问对象,如果没有再访问类
练习:描述一个老师 需要包含一个公共属性和一个独特的属性

class Teacher:
    school = 'oldboy'
t1 = Teacher()
t1.name = 'jack'
t1.age = 28

属性的增删改查

增加属性
对象变量名称.属性 = 属性值
删除属性
del 对象的变量名称.属性名称
修改
对象.属性 = 新的值

查看属性  访问的是对象的所有属性
print(对象.__dict__)

访问对象的类的信息
print(对象.__class__)
class People:
    pass
print(People.__dict__)  # 打印类的所有属性和方法  <class 'type'>
print(People.__class__)  # 打印类的类型
p1 = People()
p1.name('nick')  # 定义对象的独特属性
print(p1.__dict__)  # 打印对象的所有属性和方法
print(p1.__class__)  # 打印对象来自哪个类  <class '__main__.Student'>
print(p1.__class__.__name__)  # People

del People.属性//对象.属性/方法  删除类的属性和方法以及对对象的属性和方法

p2 = Pople()
p2.name = 'tank'  # 添加类的对象的独特属性

对象的属性的查找顺序

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

__init__方法

__init__方法叫做初始化方法,本质就是一个函数

1.当实例化对象时,会自动执行__init__方法

2.会自动将对象作为第一个参数传入,参数名称为self,self可以是别的名字,但不建议改

功能:用户给对象赋初始值

练习:创建一个类具备几个属性,通过初始化方法来给他设置属性

class Dog:
    def __init__(self,kind,color,age)
    self.kind = kind
    self.color = color
    self.age = age 
d1 = Dog("二哈","黑白",1)
d2 = Dog('泰迪',"棕色",2)

需要注意的是:该函数不能有返回值/...只能是None

对象的精髓就是将数据和处理数据的函数整合到一起,这样一来拿到一个对象就同时拿到了需要处理的数据以及处理数据的函数。

对象可以通过.调用类中函数方法,默认类中方法是对象。

类也可以通过.调用类中函数方法,这时,函数方法就是一个普通的函数,需要传对象的参数。

# 对象的绑定方法
class Student:
    def __init__(self,name,pwd):
        self.name = name
        self.pwd = pwd


    def choose_school(self):  # self是对象
        print(f'{self.name}正在选择')  # 调用类中属性,self.name


s = Student('nick','123')  # 实例化对象
s.choose_school()  # 对象使用类中方法方法

Student.choose_school(s)  # 调用类中方法需要传对象

对象的绑定方法

默认情况下类中的方法都是对象绑定方法

其特殊之处在于,

当使用对象调用该函数时会自动传入对象本身,作为第一个参数

当使用类名来调用时,它就是一个普通函数,有几个参数,就是传几个参数。

练习:写一个学生类,具备一个打招呼的技能,要输出自己的名字信息

class Student:
    
    def __init__(self,name):
        self.name = name
     
    def say_hello(self):
        print(f'hello my name is {self.name}')
        
  

类的绑定方法

类绑定方法用@classmethod来装饰

特殊之处:不管用类还是对象调用,都会自动传入类本身,作为第一个参数。

什么时候绑定给对象:当函数逻辑需要访问对象中的数时

什么时候绑定给类:当函数对象逻辑需要访问类中的数据时。

需要使用类作为参数的时候就得使用类绑定方法@classmethod

需要使用对象作为参数的时候就得使用对象绑定方法

既不需要类作为参数又不需要对象作为参数,使用非绑定方法,@staticmethod.

@classmethod让被装饰的函数给类使用,约定俗成参数为cls

绑定类的方法,类能使用,对象也可以使用,但是参数依然是类。

@staticmethod什么都不绑定,非绑定方法,定义了普通的函数。

非绑定方法

非绑定方法或叫做静态方法,就是既不需要访问类中的数据,也不需要访问对象的数据。

语法:@staticmethod

练习:为学生类添加一个save方法 一个get方法

save是将对象存储到文件中

get是将文件中获取对象

import os
import pickle
import time


class Student:
    def __init__(self, name):
        self.name = name
	
    def say_hi(self):
        print(f'hello my name is {self.name}')
        
    def save_file(self):
        # 将对象存储到文件中
        with open(self.name, 'wb') as fw:
            pickle.dump(self, fw)

    @staticmethod
    def read_file(name):
        # 从文件中获取对象
        with open(name, 'rb') as fr:
            obj = pickle.load(fr)
        return obj


stu = Student("rose")  # 实例化对象rose
stu.save_file()  # 将rose保存到文件中

stu1 = Student("nick")  # 实例化对象nick
stu1.save_file()  # 将nick保存到文件中

obj = Student.read_file("rose")  # 从文件中读取获取对象rose
print(obj.name)  # 打印rose对象的名字属性

obj = Student.read_file('nick')  # 从文件中获取对象nick
print(obj.name)  # 打印nick对象的名字

print(Student.__name__)  # 打印类名

python2中类属性调用的方法

对象的绑定方法:没有加任何装饰器的方法就是对象的绑定方法

类的绑定方法:加了@classmethod装饰器的方法就是类的绑定方法

非绑定方法:加了staticmethod装饰器的方法就是非绑定方法,其实就是一个普通的函数。

posted @ 2019-07-24 21:53  最后的别离  阅读(145)  评论(0编辑  收藏  举报