Day 27 类

一、面相对象介绍

1 什么是对象

面相对象是一种编程思想,而对象的核心就是把程序‘整合’

定义:对象是一种‘容器’,用来盛放数据(变量)与功能(函数)

2 类于对象

定义:类也是一种容器,用来存放同类别对象共有的数据与功能

例子:人类,人的对象

人类有共有的数据(居住:地球)共有的功能(能走,能吃)这是所有人类共有的,当一个新的人类对象出现时,他就具备以上的数据和功能。而这个人类对象也可以有一些独有的属性(名字:黄钊),一些他独有的功能(能写代码),这就是类和对象的关系。

我们把以上逻辑转换成编程思想

类,类的实例化对象

类是同一类对象的共有数据与方法的集合,在实例化一个新的对象时,它会同时具有这个该类中的公有数据(例:x=10)和函数(例:def run():)。我们也可以让这个实例化的对象丰富起来,给他添加他特有的数据和函数。

二、实现面向对象编程

1 先定义类

注意1:类是对象相似功能的集合体,所以类体中可以存放任意代码

注意2:类在定义时就会执行类体代码

注意3:类是为了存放对象的相似集合,并不是用于直接使用的

# 类的命名规范:通常以驼峰体
class Student:
    # 1、变量的定义
    stu_school='oldboy'

    # 2、功能的定义
    def tell_stu_info(stu_obj):
        print('学生信息:名字:%s 年龄:%s 性别:%s' %(
            stu_obj['stu_name'],
            stu_obj['stu_age'],
            stu_obj['stu_gender']
        ))

    def set_info(stu_obj,x,y,z):
        stu_obj['stu_name']=x
        stu_obj['stu_age']=y
        stu_obj['stu_gender']=z

2 属性访问

类中的数据与功能统称为类的熟悉,我们有以下两种方式去访问我们类中的熟悉

2.1 调用dict方法

# 先查看类的内置方法__dict__内存放的是什么
print(Student.__dict__)

{'__module__': '__main__', 'stu_school': 'oldboy', 'tell_stu_info': 
 <function Student.tell_stu_info at 0x000002ABCBEC1E18>, 'set_info': 
 <function Student.set_info at 0x000002ABCBEC1EA0>,
 '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}

# 可以看到类的dict方法得到的是一个类的字典,其中有一部分是变量名和函数名和他们对应的内存地址
#所以我们可以通过字典取key的方法去查找类的属性

print(Student.__dict__['stu_school'])
>>>oldboy

print(Studeng.__dict__['tell_stu_info'])
>>><function Student.tell_stu_info at 0x000001FF7E511E18>

2.2 类.属性

上面的方法通常情况不会使用,有一种更简单的方法

print(Student.stu_school)
>>>oldboy
print(Student.set_info)
>>><function Student.tell_stu_info at 0x000001FF7E511E18>

3 调用类产生对象

stu1_obj=Student()
print(stu1_obj.set_info)
>>><bound method Student.set_info of <__main__.Student object at 0x0000022D4D3374E0>>
'''
这里我们通过调用对象在类中的共有方法可以发现,在此处他不再是一个函数而是一个绑定方法
准确的来说,在新建一个对象时,他会具备类的中所有属性,但是这个具备是有区别的
类的名称空间类似于全局名称空间
对象的名称空间类似函数的局部名称空间
我们可以在局部找全局,但是不能在局部修改全局,可以在全局修改局部

'''
stu2_obj=Student()
stu3_obj=Student()

4 对象的自定义属性

在实例化一个对象后,我们可以给对象添加新的属性,如果这些新的属性都有同样的属性名,我们可以把他放在类中去定义

class Student:
    # 1、变量的定义
    stu_school='oldboy'
    # 对象的私有属性
    def __init__(self, x, y, z):
        self.name = x  # 空对象.stu_name='egon'
        self.age = y  # 空对象.stu_age=18
        self.gender = z  # 空对象.stu_gender='male'
    # 2、功能的定义
    def tell_stu_info(self):
        print('学生信息:名字:%s 年龄:%s 性别:%s' %(
            self.name,
            self.age,
            self.gender
        ))
    def set_info(self,x,y,z):
        self.name=x
        self.age=y
        self.gender=z

这时候调用类产生对象会发生三件事

  1. 产生一个空对象
  2. python会自动调用类中的--init--方法,然后将空对象已经调用的类时括号的参数一同传入
  3. 返回执行完类中init方法的对象
stu1_obj=Student('egon',18,'male') 

总结--init--方法

  1. 会在调用类的时候自动触发执行,用来为对象初始化自己独有的数据
  2. --init--内应该存放对象初始化属性的功能,但是可以存放任意其他代码,想要在类调用时就理科执行的代码都可以放在这个方法内
  3. --init--方法必须返回None

5 类的函数和对象的绑定方法

我们要调用类中定义的函数必须遵循该函数的使用规范

stu1_obj = Student('hz',18,'male')
Student.tell_stu_info(stu1_obj)#该函数需要传入一个参数
>>>学生信息:名字:hz 年龄:18 性别:male

对象的绑定方法:对象在创建的时候,类中的函数会把这个函数绑定给对象。

使用:使用方法和函数没有区别,唯一的区别是,我绑定的这个实例化对象会作为这个函数的第一个参数传入

stu1_obj = Student('hz',18,'male')
stu1_obj.tell_stu_info()
>>>学生信息:名字:hz 年龄:18 性别:male

扩展:python中万物皆对象

#例子:
l1 = [1,2,3,4]
#l1是list类的实例化对象,我们可以在l1上使用list所有的内置函数,即l1的绑定方法

猜你喜欢

转载自www.cnblogs.com/AaronY/p/12657112.html