当前位置: 首页 > article >正文

python全栈学习记录(二十)类的属性传递与绑定方法

类的属性传递与绑定方法

文章目录

  • 类的属性传递与绑定方法
  • 一、面向对象与面向过程
  • 二、类
  • 三、类的属性
  • 四、类的绑定方法

一、面向对象与面向过程

面向过程编程:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么然后干什么。。。基于该思想编写程序好比在设计一条流水线,是一种机械式的思维方式。

  • 优点:复杂的问题流程化、进而简单化
  • 缺点:扩展性差

面向对象编程:核心对象二字,对象是数据与功能的结合体,其精髓在于整合两个字上。面向对象本质上就是将一系列的数据和功能整合到一块儿,然后利用这个集合对数据进行操作。

  • 优点:可扩展性强
  • 缺点:编程的复杂度要高于面向过程

二、类

对象是数据和功能的结合体,类是一系列对象相似的数据和功能的结合体。
在现实世界中:先有的一个个具体存在的对象,然后随着人类文明的发展才了分类的概念。
在程序中:必须先定义类,后调用类来产生对象。

类的定义可以按照以下的方式:

class School():
    school='五道口职业技术学院'

    def choose_course(self):
        print('is choosing course')

#__dict__可以查看类内部存放的属性和方法
print(School.__dict__)
#修改类的属性,相当于School.__dict__['school']='六道口职业技术学院'
School.school='六道口职业技术学院'
print(School.school)
<<<"六道口职业技术学院"

#给类添加新属性,相当于School.__dict__['student_num']=1000
School.student_num=1000
print(School.student_num)
<<<1000

#调用类的方法
School.choose_course(111)
<<<"is choosing course"

其中school称为类的属性,choose_course称为类的方法。类体代码会在类定义阶段就立刻执行,会产生一个类的名称空间。类的本身其实就是一个容器/名称空间,是用来存放名字的,这是类的用途之一。

三、类的属性

调用类的过程就是将类实例化的过程,调用类后拿到的返回值就是类的一个对象,也可以称之为类的一个实例。

class School():
    school='五道口职业技术学院'

    def choose_course(self):
        print('is choosing course')

s1=School()
s2=School()

给不同的实例定制不同的属性:

class School():
    school='五道口职业技术学院'

    def choose_course(self):
        print('is choosing course')

s1=School()
s2=School()
print(s1.__dict__,s2.__dict__)
<<<{} {}
#实例s1、s2初始时没有任何的属性值,如果调用school属性本质是取了School类的属性
#换句话说就是School的实例会继承School的属性
print(s1.school,s2.school)
<<<'五道口职业技术学院' '五道口职业技术学院'

#给实例添加属性
s1.num,s2.num=1,2
#可以看到给s1和s2添加属性本质就是在实例的名称空间内增加了一个变量
print(s1.__dict__,s2.__dict__)
<<<{'num': 1} {'num': 2}

#给实例定制新的属性
s1.school,s2.school='六道口职业技术学院''七道口职业技术学院'
print(s1.school,s2.school)
<<<'六道口职业技术学院''七道口职业技术学院'

如果想在实例化的过程中就给实例定制属性,可以使用__init__方法,__init__方法会在类实例化以后自动调用,负责初始化实例的属性,切记__init__方法不能有返回值

class School():
    school='五道口职业技术学院'
	
	def __init__(self,num):
		self.num=num

    def choose_course(self):
        print('is choosing course')

s1=School(1)
s2=School(2)
print(s1.num,s2.num)
<<<1 2

以上代码的运行过程是先实例化类产生实例,然后将实例化时传的参数传给__init__生成s1、s2自己的属性s1.num、s2.num。

查找属性时解释器会先从对象中查找,找不到在到类中查找,以此类推。

class School():
    school='五道口职业技术学院'
	num=3
	
	def __init__(self,num):
		self.num=num

    def choose_course(self):
        print('is choosing course')

s1=School(1)
s2=School(2)
print(s1.num,s2.num)
<<<1 2

del s1.num,s2.num
print(s1.num,s2.num)
<<<3 3

四、类的绑定方法

类中的方法类可以直接调用,不过要给self参数传值,但是一般而言类的方法是绑定被对象使用的。当类的方法在实例中调用时,方法就会被绑定给实例,而方法中的self参数会被自动传值为实例的内存地址。

class School():
    def choose_course(self):
    	print(self)

s1=School()
s2=School()
#绑定给不同对象的方法内存地址有所不同
print(School.choose_course,s1.choose_course,s2.choose_course)
<<< <function School.choose_course at 0x000001E4B2EC9160> 
<bound method School.choose_course of <__main__.School object at 0x000001E4B2EC7EE0>> <bound method School.choose_course of <__main__.School object at 0x000001E4B2EC7EB0>>

School.choose_course(111)
s1.choose_course()
s2.choose_course()
#类中调用方法self就是传的参数,而实例中调用绑定方法self是实例的内存地址。
<<<111
<<< <__main__.School object at 0x00000211737D7F10>
<<< <__main__.School object at 0x00000211737D7EE0>

注意点:

  • 类中的方法第一个参数名称没有硬性的规定,不过约定俗成使用self作为绑定方法的第一个参数名。

在python基础中学到的容器类型其实也是一个类,而它们的内置方法就是绑定给类的方法。

print(list)
l1=[]
print(l1.append)
<<< <class 'list'>
<<< <built-in method append of list object at 0x000002727FCFA880>

http://www.kler.cn/a/327563.html

相关文章:

  • 计算机网络-理论部分(二):应用层
  • 使用Python编写一个简单的网页爬虫,从网站抓取标题和内容。
  • 如何合理设计一套springcloud+springboot项目中的各个微服务模块之间的继承关系的最优方案
  • torch.is_storage()
  • 性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告
  • 【爬虫实战】抓取某站评论
  • Leetcode 3303. Find the Occurrence of First Almost Equal Substring
  • 【分布式微服务云原生】 RPC协议:超越HTTP的远程通信艺术
  • 基于Springboot+Vue的c语言学习辅导网站的设计与实现 (含源码数据库)
  • 中间件:SpringBoot集成Redis
  • 【Python|接口自动化测试】使用requests库发送HTTP请求
  • Django连接Azure服务器里的gpt-4o并实现聊天功能
  • PHP程序如何实现限制一台电脑登录?
  • maven parent: 指定了项目的父 POM packaging: 指定打包类型为 POM。 modules: 列出了该项目包含的子模块,
  • 【开源免费】基于SpringBoot+Vue.JS校园资料分享平台(JAVA毕业设计)
  • opus基础简介(github)
  • 使用rsync+jenkins实现服务自动部署全流程
  • React 生命周期 - useEffect 介绍
  • WebGIS包括哪些技术栈?怎么学习?
  • 足球青训俱乐部后台:Spring Boot开发策略
  • 滚雪球学MySQL[11.1讲]:总结与展望
  • Spring Boot 点餐系统:简化您的订餐流程
  • 一个服务器可以搭建几个网站
  • vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写
  • SpringBootTest Mockito 虚实结合编写测试
  • LPDDR4芯片学习(二)——Functional Description