面向对象初介绍

今天的学习内容:面向对象的概念、类和对象的概念、如何创建类和对象、如何设计属性、属性的查找顺序、初始化方法以及绑定方法与非绑定方法

面向对象概念

提问:什么是面向对象?

答:面向对象是一种编程的思想,它的核心是对象,而程序则是一系列对象的集合,程序员负责调度这些对象来交互从而完成任务。

面向对象的优缺点:

优点

1、扩展性:方便对程序进行扩展,而且当你在对一个对象进行修改的时候不会对其它对象产生影响,而且修改的结果会很快反映到整个体系中。

2、灵活性:不用和面向过程一样对整体大动干戈。

3、重用性:对象可以进行重复调用。

缺点:

1.程序的复杂度提高了:对于新手容易出现过度设计的情况,而在扩展性要求比较低的情景下使用也会增加编程难度。

2.无法预知准确的结果:面向对象是用过对象之间的交互来解决问题,所以不能够预知解决问题的过程,也不能预知准确的结果。

使用场景:

对于扩张性要求比较高的程序,通常直接面向用户的:QQ、微信等

注意:面向对象和面向过程的编程使用一定要根据分析具体的需求来确定。

类和对象概念

类:类就是类型,是一种抽象的概念,也就具备相同特征和相同行为的事物的集合。

对象:就是具体的某个事物,具备它自己的特征与行为,可以看做特征和技能的结合体。

类和对象的关系:类包含一系列对象,对象属于某个类

#先有类还是先有对象
"""
在实际生活中:先有对象后有类
在现实生活中各种各样的事物是具体存在,而我们根据他们的很多相同的特点将它们划分为统一类,但事实上事物是具体存在的,而类只是一个概念,并没有实际存在


在程序中:务必保证先定义类,后产生对象
这与函数的使用是类似的,先定义函数,后调用函数,类也是一样的,在程序中需要先定义类,后调用类,不一样的是,调用函数会执行函数体代码返回的是函数体执行的结果,而调用类会产生对象,返回的是对象
"""

总结:我们在使用面向对象编程时,第一步需要思考需要什么样的对象,这些对象我们需要它具备什么样的特征和行为,然后我们根据这些信息得出我们所需要的类型。

如何创建类和对象

#定义类的名称
class 类的名称:
        # 类的内容描述属性和技能
        # 描述属性用变量
        # 描述行为用函数

#类的名称 书写规范:首先需要见名知意,然后名称是用大驼峰命名法
#大驼峰就是单词第一个字母大写,小驼峰就是第一个字母小写
#创建对象的语法
class Person:
    pass

#创建对象
p = Person()如何设计属性、属性的查找顺序
#总结:类和对象的定义与调用模式
class 类名:
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西               
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可
self:在实例化时自动将对象/实例本身传给__init__的第一个参数

如何设计属性、属性的查找顺序

属性可以写在类中,也可以写在对象中

类中的属性是所有对象公共的,对象中的属性是每个对象独特的(不一样的)

查找顺序:“如果类中和对象中存在同样的属性,先访问对象,如果没有再访问类。

#增加属性 
对象变量名称.属性名称 = 属性值

#删除属性
del 对象的变量名称.属性名称 

#修改 
对象.属性 = 新的值 

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

#访问对象的类信息
print(对象.__class__)
一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值

二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)

初始化方法

__init__方法:初始化方法,本质上就是一个函数

特点1:当实例化对象时,会自动执行__init__方法。

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

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

class Dog:
    def __init__(self,kind,color,age):
        self.kind = kind
        self.color = kind
        self.age = age

d1 = Dog('二哈','黑白',1)
d2 = Dog('泰迪','棕色',2)
print(d1.__dict__)  # {'kind': '二哈', 'color': '二哈', 'age': 1}
print(d2.__dict__)  # {'kind': '泰迪', 'color': '泰迪', 'age': 2}

#注意,该函数不能有任何返回值,只能是None
#为对象定制一个行为
#就是在类中创建一个函数
    def say_hi(self):
        
        print("hello i am a student! my name:%s" % self.name)
#传入self,可以在其中调用self的属性

绑定与非绑定方法

默认情况下类中的方法都是对象绑定方法,特殊的地方在以下两点:

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

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

class Student:
    school = "oldgirl"
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender

    def say_hi(self):
        print("hello i am a student! my name:%s" % self.name)



stu1 = Student("jack",20,"male")  # 使用对象调用该函数,会自动传入
stu1.say_hi()
Student.say_hi(stu1) # 使用类来调用,就是一个普通函数,有几个参数就传几个

类绑定方法

类绑定方法用@classmethod来装饰

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

class OldBoyStudent:
    school = "oldboy"

    def __init__(self,name):
        self.name = name

    @classmethod
    def show_school(cls):
         print(cls)

OldBoyStudent.show_school() # <class '__main__.OldBoyStudent'>
print(OldBoyStudent) # <class '__main__.OldBoyStudent'>

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

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

非绑定方法

或叫做静态方法,就是即不需访问类的数据,.也不需要访问对象的数据

语法:@staticmethod

不常用

  @staticmethod
    def print_hello():
        print("hello world")

 总结

类与对象

对象的本质是一个容器/名称空间,用来存放对象特有的属性。

类的本质也是一个容器/名称空间,用来存放对象相同的属性。

类的用途有两种:

1.当容器使用时,用来存放类的数据属性和类的函数属性

2.调用类的过程,也就是实例化,产生的结果是对象。

(实例化过程:①先产生一个空对象②触发__iniit__(空对象,arg1,arg2...))

原文地址:https://www.cnblogs.com/wangnanfei/p/11241363.html