面向对象与类

面向对象与类

何为面向对象

面向对象,按照字面意思就是根据对象来进行编程,实际上面向对象就是一种思维方式的转变
按照这种编程思想编程大致可分为两类,一种是面向过程编程,一种就是面向对象编程
面向过程编程
    就是按照事物的发展顺序一步一步来,并且随着事物的发展问题的解决也会变得越来越简单
    我们到目前为止所学习使用的几乎都是面向过程编程
面向对象编程
    首先面向对象在编程中就是数据与功能的绑定,也就是功能只能给特定的数据使用
    其次对象在python中可以看成是容器,用于存放数据与功能,也就是对象就是数据与功能的结合体
    ps:python中一切皆对象
    

面向对象之类与对象

面向对象并不是一门新的技术,但是为了使用方便和很好的区分开,针对面向对象设计了新的语法格式
在python中要产生对象就必须要借助类

类的语法结构
    class 类名(通常首字母大写):
        对象公共的数据
        对象公共的功能
    1.class 是定义类的关键字
    2.类名的命名与变量名几乎一致,但是为了区分开类名与变量名所以一般推荐类名首字母大写
    3.数据就是变量名与数据值的绑定,功能就是函数
类的定义与调用
    类在定义阶段就会执行类体代码,但这是属于类的局部名称空间,外界无法直接调用,如果需要访问数据或功能,那么可以统一采用句点符
    
class Student:
    school_name = '老男孩'

    def choice_course(self):
        print('选择课程')

# 查看名称空间
print(Student.__dict__)
# {'__module__': '__main__', 'school_name': '老男孩','choice_course': <function Student.choice_course at 0x000001C2978994C0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}

# 访问数据或功能
print(Student.school_name)  # 老男孩
print(Student.choice_course)  # <function Student.choice_course at 0x00000195845294C0>
按照名称空间我们可以使用Student.__dict__.get()来访问数据或功能,但是这样太麻烦了,所以在面向对象中统一采用句点符来访问数据或功能

# 类的调用即产生对象
类名加括号会产生一个对象并且每执行一次都会产生一个新的对象(生孩子???)
stu1  = Student()  # 生了老大
print(stu1.__dict__)  # {} 老大自己个是个穷光蛋,毛都没有
print(stu1.school_name)  # 老男孩  还好父母给帮忙
Student.school_name = '老小孩'  # 类里面的数据值可以直接修改
print(stu1.school_name)  # 老小孩  

对象独有的数据和功能

除却类里面的公共数据和功能外,只能对象自己访问的数据(孩子长大了有家产了!!!)

class Student:
    school_name = '老男孩'

    def choice_course(self):
        print('选择课程')
        
stu1 = Student()
stu2 = Student()
# 给每个对象添加独有的数据
# 1.先查看一下对象的名称空间
print(stu1.__dict__)  # {} 是一个空字典
# 2.给对象添加数据也就是往名称空间中添加数据》》往字典中添加键值对
stu1.__dict__['name'] = 'zyg'
stu1.__dict__['age'] = '18'
print(stu1.__dict__)  # {'name': 'zyg', 'age': '18'}
# 3.访问数据就可以直接使用句点符
print(stu1.name)  # zyg

# 添加数据太麻烦了,优化一下吧,弄成函数
def init(stu, name, age):
    stu.__dict__['name'] = name
    stu.__dict__['age'] = age

init(stu1, 'zyg', 18)
print(stu1.__dict__)  # {'name': 'zyg', 'age': 18}

# 新问题又来了,init这个函数谁来了都能用,但是这是只给学生用的》》把函数放到类里面
class Student:
    school_name = '老男孩'

    def init(stu, name, age):
        stu.__dict__['name'] = name
        stu.__dict__['age'] = age

    def choice_course(self):
        print('选择课程')


stu1 = Student()
stu2 = Student()
Student.init(stu1, 'zyg', 18)
print(stu1.__dict__)  # {'name': 'zyg', 'age': 18}

# 能不能把Student.init(stu1, 'zyg', 18)这一步去掉?
class Student:
    school_name = '老男孩'

    def __init__(stu, name, age):
        stu.__dict__['name'] = name
        stu.__dict__['age'] = age

    def choice_course(self):
        print('选择课程')


stu1 = Student('laj', 3)
print(stu1.__dict__)  # {'name': 'laj', 'age': 3}

# 函数再升级
class Student:
    school_name = '老男孩'

    def __init__(stu, name, age):
        stu.name = name  # stu.__dict__['name'] = name
        stu.age = age

    def choice_course(self):
        print('选择课程')


stu1 = Student('laj', 3)
print(stu1.__dict__)  # {'name': 'laj', 'age': 3}

这是对象独有数据的添加,那么对象独有的功能呢?
严格意义上来说对象没有自己独有的功能,它所使用的功能是定义在类里面的公共函数,只是类有一个特征:功能是公共的,结果是独有的(对象在使用功能时会将自己当做第一个参数传入)
class Student:
    school_name = '老男孩'

    def __init__(stu, name, age):
        stu.name = name  # stu.__dict__['name'] = name
        stu.age = age
 
    def choice_course(self):
        print('选择课程')

Student.choice_course(123)  # 选择课程
stu1.choice_course()  # 选择课程

原文地址:http://www.cnblogs.com/zyg111/p/16852521.html

发表评论

您的电子邮箱地址不会被公开。