一.面向对象(oop)
面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。
优点:复杂的问题流程化进而简单化
缺点:可扩展性差,维修性差
面向对象的程序设计:其核心在于对象,对象是特征和技能的结合体,基于面向对象设计程序就类似于在创造一个世界,在这个世界中万物皆可定义,存在的都是对象不存在的事物也可以自己取创造.在写程序时,程序都是由一个个对象构成的,程序猿负责调度控制这些对象交互着完成任务
优点:程序的扩展性高,灵活性高,重用性高
缺点:编程的复杂性高于面向过程,无法准确的知道结果
面向对象的应用场景:
对扩展性要求较高的程序,如qq,微信等
二.类和对象
对象:对象是特征与技能的结合体(实际存在的)
类;是一系列对象相似的特征与技能的结合体(抽象的)
类和对象的关系:
类包含一些列的对象
对象属于某个类
ps:在生活中时现有对象在有类的,在程序设计中是先定义类,在产生对象
总结:在编程的过程中我们需要先思考需要什么样的对象,该对象有什么特征和技能,从而根据这些来推断出我们需要什么样的类
三.如何创建类和对象
类定义的语法:
class Student: school='oldboy' def __iinit__(self,name,age,sex): self.name=name self.age=age self.sex=sex
ps:1.在类中描述属性(特征)用变量,描述技能(行为)用函数
2.类的命名方式要做到见名之意书写时是大驼峰体,即每个单词的首字母大写
3.类中可以写任何python代码这些代码在类的定义阶段就回执行
4.可以通过类名.__dict__查看类的名称空间
ps:1.类中的属性是对象公有的id都是一样的
2.属性也可以写在特征中,若写在特征中着代表是对象特有的
属性的访问方式:类名/对象名.属性名
class Student: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex print(Student.school) stu1=Student('zhang',19,'man') print(stu1.name)
属性的访问顺序:
现在对象自己的名称空间查找,若是没有会去对象属于的类中寻找,若类中没有回报错
属性的增删改查:
class Student: school='oldboy' def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex stu1=Student('zhang',19 ,'man') stu1.grade=90 print(stu1.__dict__) # 查看stu1的属性 del stu1.grade print(stu1.__dict__) stu1.name='wang' print(stu1.__dict__)
__init__方法:
# __init__方法(为对象初始化自己独有的特征) # 强调: # 1、该方法内可以有任意的python代码 # 2、一定不能有返回值 class People: country='China' x=1 def __init__(obj, name, age, sex): #obj=obj1,x='egon',y=18,z='male' # if type(name) is not str: # raise TypeError('名字必须是字符串类型') obj.name = name obj.age = age obj.sex = sex def run(self): print('----->', self) # obj1=People('egon',18,'male') obj1=People(3537,18,'male') # print(obj1.run) # obj1.run() #People.run(obj1) # print(People.run)
ps:1.当实例化(生成对象)时会自动执行__init__方法
2.会自动将第一个参数传入,参数位self,self的名字可以改,但是不建议
四.绑定方法/非绑定方法
什么是方法:
生活中对象的技能在程序中用函数表示函数在面向对象中称之为方法,换种称呼而已!如此说来,绑定方法也就是绑定函数
一:绑定方法
1.绑定到对象的方法:没有被任何装饰器装饰的方法。
在类中定义的函数默认都是绑定到对象的方法
特点:参数的第一个必须是self 表示当前对象本身,使用对象来调用,调用时会自动传入对象
2.绑定到类的方法:用classmethod装饰器装饰的方法。
特点:参数的第一个必须是cls表示当前类本身,使用类名来调用,调用时会自动传入类
ps:self和cls是一种约定俗称的方法,不建议修改
二:非绑定方法:用staticmethod装饰器装饰的方法
特点:不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通函数
不过由于作用域在类中所以需要使用类或对象类调用
class Student: school = "Tsinghua" def say_hello(self): # 绑定到对象的方法 print(self) print("hello i am a student my name is %s" % self.name) def __init__(self, name): # 绑定到对象的方法 self.name = name @classmethod # 绑定到类的方法 def school_info(cls): print(cls) print("the student from %s" % cls.school) stu1 = Student("Jack") print(stu1) # 输出 <__main__.Student object at 0x1063112e8> # 1.调用对象绑定方法 stu1.say_hello() # 输出 <__main__.Student object at 0x1063112e8> # 输出 hello i am a student my name is Jack # 查看对象绑定方法 print(stu1.say_hello) # 输出 <bound method Student.say_hello of <__main__.Student object at 0x10552b2e8>> # 含义 这个绑定方法是Student类中的say_hello函数,绑定到地址为0x10552b2e8的Student对象 # 绑定方法本质上也是函数 只要能找到它就能调用它所以你可以这样来调用它 Student.say_hello(stu1) # 输出 <__main__.Student object at 0x103818390> # 输出 hello i am a student my name is Jack print(Student) # 输出 <class '__main__.Student'> # 2.调用类绑定方法 Student.school_info() # 输出 <class '__main__.Student'> # 输出 the student from Tsinghua # 查看类绑定方法 print(Student.school_info) # 输出 <bound method Student.school_info of <class '__main__.Student'>> # 含义 这个绑定方法是Student类中的school_info函数,绑定到Student这个类
绑定到类的方法与绑定到对象的方法总结
异同点:
相同
绑定对象调用时都有自动传参的效果
绑定到谁给谁就由谁来调用
不同
绑定到类的方法自动传入当前类
绑定到对象的方法自动传入当前对象
ps:
当使用对象调用该函数时会自动传入对象本身,作为第一个参数
当使用类名来调用时他就是一个普通函数,有几个参数就得传几个参数