首页 > 编程语言 >面向对象编程

面向对象编程

时间:2022-11-02 16:22:34浏览次数:39  
标签:__ .__ name 对象 dict 面向对象编程 print

内容概要

  • 面对对象核心思路
  • 编程思想
  • 面向对象之类与对象
  • 类与对象的创建
  • 对象独有的数据(属性)
  • 对象独有的功能(方法)

面对对象核心思路

我们如果没有对象的存在,我们有一些数据 我们需要查看,
例:
name = '小王'
age = 18
def get_info(name,age):
    print('%S:%S' %name,age)
我们只能通过这样的方式去查看用户的信息,
这样的方法只能说很麻烦,并且我们查看用户信息需要调用 get_info函数 并且要在里里面给他传值
所以这就很麻烦

我们学了对象后,那么对象就是:  # 用于存放数据与功能的容器

面对对象核心思路:#  数据和功能的结合体


编程思想

1.面向过程编程:
	过程及流程,面向过程编程就是按照固定的流程解决问题
    我们在编程过程中需要列举出每一步的流程 并随着步骤的深入问题的解决越来越简单
2.面向对象编程:
	对象及容器,数据与功能的结合体(属性和方法的结合体)  # python中一切皆对象
    面向对象编程 就是要造出一个个不同的对象,把原本分散开的相关数据与功能整合到一个个的对象当中
    至于该对象将来会如何发展跟程序员没关系 也无法控制
    这样不仅能方便我们使用,而且可以提高程序的可扩展性
'''
上述两种编程思想没有优劣之分,我们在编程的时候需要结合实际需求去制定思想
这两种编程思想是相互交融的,只是在一些代码中的占比不同而已
'''

类与对象

我们在开篇提到了对象:
对象: # 数据与功能的结合体 (属性与方法)   
类:多个相同数据与功能的对象的结合体  类主要就是为了节省代码
有了类的好处是,当我们的对象有相同的属性和相同的功能时,我们可以把对象定义成一个类,这样就可以让我们不需要重复的去定义对象

image

综上所述我们得知
现实中的情况应该时先有对象在有类
但是在程序中时反着来的:如果想要产生对象那么就得先定义类

类与对象的创建

1.类的语法结构
	class 类名:  # class为定义类的关键字
    '''类体注释'''
    	对象公共的数据
        对象公共的功能
   # 类名的命名与变量名几乎一致 需要注意的时候首字母推荐大写用于区分
2.类的定义与调用
	类在定义阶段就会执行类体代码,但是是属于类的局部名称空间 外界无法直接调用
    
 我们通过实例来推演选课系统
# 需求:清华大学学生选课系统
# 定义类:

class Student:
    school_name = '北京大学'

    def choice_course(self):
        print('学生都有选课的功能~')
# 1.查看名称空间(__dict__这个功能就可以将类的名称空间中的数据通过字典的形式展现出来):
print(Student.__dict__)
# {'__module__': '__main__', 'school_name': '北京大学', 'choice_course': <function Student.choice_course at 0x0000013A2586B4C0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
print(Student.__dict__.get('school_name'))  # 北京大学
func = Student.__dict__.get('choice_course')
func(1)  # 我们在定义对象时候公共功能里面默认填写了self 所以我们需要填写形参
# func(1) 结果为 学生都有选课的功能~
print(Student.school_name)
# 相当于 类名+点的方式等价于Student.__dict__.get('school_name')
func2 = Student.choice_course
func2(1)
# 与上方的func = Student.__dict__.get('choice_course') 调用 func(1) 相同

# 类的调用>>>>就可以产生对象:
'''我们通过类名加括号的形式就可产生一个对象,每次产生的对象都不一样'''
object1 = Student()
object2 = Student()
object3 = Student()
print(object1,object2,object3)
# <__main__.Student object at 0x000002AF88E45A30> <__main__.Student object at 0x000002AF88E800D0> <__main__.Student object at 0x000002AF88E800A0>
# 我们可以看到它们的内存地址都是不同的,这也证明了 每次产生的对象都不一样的说法
print(object1.__dict__)  # 我们对对象使用__dict__方法 查看objct1-3对象的名称空间
print(object2.__dict__) # 对象的公共数据为'北京大学' 对象的公共功能为'学生都有选课的功能~'
print(object3.__dict__) # 由于对象自己本身内部目前什么都没有  所以打印出来的是三个空字典
print(object1.school_name)  # 但是对象还是可以通过点的方式去调用 公共的数据
print(object2.school_name)  # 北京大学 * 3
print(object3.school_name)
#<bound method Student.choice_course of <__main__.Student object at 0x000002B48AF05A30>>
# <bound method Student.choice_course of <__main__.Student object at 0x000002B48AF400D0>>
# <bound method Student.choice_course of <__main__.Student object at 0x000002B48AF400A0>>
print(object1.choice_course)  # 但是在这里按理来说对象的公共功能不应该内存地址不一样呀
print(object2.choice_course)  # 接下来我们来看一下这到底是为什么
print(object3.choice_course)

对象独有数据(属性)

# class Student:
#     # 对象公共的数据
#     school_name = '北京大学'
#
#     # 对象公共的功能
#     def choice_course(self):
#         print('学生选课功能')
#
#
# object1 = Student()
# object2 = Student()
# '''推导流程1:每个对象手动添加独有的数据'''
# object1.__dict__['name'] = 'xiaoming'  # 这里与字典的操作方式一样
# object1.__dict__['age'] = 18  # 有键则修改值 ,无键则新增键值对
# print(object1.__dict__)
# # 现在在我们object1 对象的名称空间内 多了{'name': 'xiaoming', 'age': 18}
# object2.__dict__['name'] = 'wangge'
# object2.__dict__['age'] = 28
# print(object2.__dict__)
# # 现在我们object2 对象 名称空间内 多了{'name': 'wangge', 'age': 28}
# # 我们在类与对象的定义与调用里面说了
# # 对象.__dict__.get(键) == 对象.键
# # 所以我们通过对象.的方式也可以调出对象中存储的数据
# print(object1.age)  # 18
# print(object2.name)  # wangge
#
# # 成功了,这样的话我们就可以给对象添加独有数据的这些操作封装成一个函数了
# def init(obj, name, age):
#     obj.__dict__['name'] = name
#     obj.__dict__['age'] = age

# 虽然这个函数封装好了,但是这个函数不光光是学生对象能调用,所有对象都可以调用
# 所以我们需要把这个函数添加到类中
# class Student:
#     # 对象公共的数据
#     school_name = '北京大学'
#
#     # 专门给学生添加独有数据的功能
#     def init(obj, name, age):
#         obj.__dict__['name'] = name
#         obj.__dict__['age'] = age
#     # 对象公共的功能
#     def choice_course(self):
#         print('学生选课功能')
# # 我们通过对象+.的方法就可以将这个添加数据的函数调出来使用
# object1 = Student()
# object2 = Student()
# object1.init(object1,'xiaoming',18)
# object2.init(object2,'wangge',28)
# print(object1.__dict__, object2.__dict__)
# 我们成功了


# 接下来我们来看一下__init__方法
# class Student:
#     # 对象公共的数据
#     school_name = '北京大学'
#
#     # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
#     def __init__(obj, name, age):
#         obj.__dict__['name'] = name
#         obj.__dict__['age'] = age
#
#     # 对象公共的功能
#     def choice_course(self):
#         print('学生选课功能')
#
# stu1 = Student('xiaoming', 18)  # 我们在产生对象的时候在类名()内填写对象的属性即可
# print(stu1.__dict__)
# print(stu1.name)
# print(stu1.school_name)


# 最后一步

class Student:
    # 对象公共的数据
    school_name = '北京大学'

    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
    def __init__(self, name, age):  # 类中定义的双下方法 都会在特定的时间段自动触发
        self.name = name  # 等价于 self.__dict__['name'] = name
        self.age = age
    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')

stu1 = Student('xiaoming', 18)
print(stu1.name)  # xiaoming
print(stu1.school_name)  # 北京大学

对象的独有功能(方法)

# 对象的独有功能
class Student:
    # 对象公共的数据
    school_name = '北京大学'

    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
    def __init__(self, name, age):  # 类中定义的双下方法 都会在特定的时间段自动触发
        self.name = name  # 等价于 self.__dict__['name'] = name
        self.age = age
    # 对象公共的功能
    def choice_course(self):
        print(f'学生{self.name}正在选课~')
stu1 = Student('xiaoming', 18)
stu2 = Student('wangge',28)
print(stu1.name)  # xiaoming
print(stu1.school_name)  # 北京大学
# 对象的数据我们已经处理完毕了,但是它的独有功能又应该放在这个类中的哪里呢?
# 我们只能将定义好的独有功能放进类中,但是类中又有其他对象的公共功能
# 所以我们有了定义
'''定义在类中的功能,默认是绑定给对象使用的,谁使用谁就是主人公'''
stu1.choice_course()  # 学生xiaoming正在选课~
stu2.choice_course()  # 学生wangge正在选课~
# 对象修改数据值
stu1.name = 'tony'  # 当点的名字已经存在的情况下 则修改对应的值
# 对象新增数据值
stu1.pwd = 123  # 当点的名字不存在的情况下 则新增数据
print(stu1.__dict__)

标签:__,.__,name,对象,dict,面向对象编程,print
From: https://www.cnblogs.com/ddsuifeng/p/16851418.html

相关文章

  • 面向对象编程
    面向对象编程一、面向对象之人狗大战'''推导思路:1.代码定义出人和狗2.将产生人和狗的字典封装成函数3.定义人打狗的动作,和狗咬人的动作(生命值=攻击力-生命值)4.解......
  • 面向对象编程
    1.对象Object对象的两个部分:属性、行为面向对象编程的三大特点:封装、继承、多态2.封装写程序的时候也可以采用封装的理念,对于一些内容我们不提供接口来使用它们,它们属......
  • 05面向对象编程
    对象的创建分析//面向对象编程本质:以类的方式组织代码,以对象的组织(封装)数据面向对象三大特性抽象类和接口内部类及OOP实战......
  • 面向对象编程
    面向对象编程以类的方式组织代码,以对象的组织(封装)数据封装、继承、多态修饰符返回值类型方法名(...){方法体返回值}方法的调用静态方法static非静态方法......
  • Python进阶篇04-面向对象编程
    面向对象编程面向对象编程和面向过程编程的区别:类和实例类:抽象的、用于创建实例的基础模板,类里面可以定义这个类所拥有的基础的属性。实例:根据类而创建的具体的对象,实......
  • 面向对象编程 封装继承
    访问修饰符访问修饰符访问级别public公有地,外部可以访问protected受保护的,只有本类和派生类才能够访问private私有的,只有本类中可以访问封装字段......
  • 初始面向对象编程
    OOP面向对象编程类的结构classStudent{}类与对象classProgram{//主方法(程序入口)staticvoidMain(string[]args){//张三是Student实例......
  • 深入理解python面向对象编程(python基础语法004)
    ......
  • 面向对象编程
    面向对象编程包语法packagecom.pac1.pac2.pac3packagecompackagepac1{packagepac2{packagepac3{objectScalaPackage{......
  • 面向对象编程-正则表达式
    我相信不管是学什么语言,是哪个派路的对这几个字应该不会陌生吧,正则表达式终于让我给碰到了,之前看到了说实话那是真看不懂,一点头绪没有,猜我都猜不出是什么意思,今天终于把这个......