面向对象初识

一. 面向对象初识    

1.1 回顾面向过程编程vs函数式编程          

# 面向过程编程 测量对象的元素个个数。
s1 = 'fjdsklafsjda'
count = 0
for i in s1:count += 1l1 = [1,2,3,4]
count = 0
for i in l1:count += 1
面向过程编程
def func(s):count = 0for i in s:count += 1return count
func('fdsafdsa')
func([1,2,3,4])
函数式编程

通过对比可知:函数编程较之面向过程编程最明显的两个特点:

1,减少代码的重用性。

2,增强代码的可读性。

1.2 函数式编程vs面向对象编程     

# 函数式编程# auth 认证相关
def login():passdef regisgter():pass# account 账户相关
def func1():passdef func2():pass# 购物车相关
def shopping(username,money):pass
def check_paidgoods(username,money):pass
def check_unpaidgoods(username,money):pass
def save(username,money):pass
函数式编程
class LoginHandler:def login(self):passdef regisgter(self):passclass Account:def func1(self):passdef func2(self):passclass ShoppingCar:def shopping(username,money):passdef check_paidgoods(username,money):passdef check_unpaidgoods(username,money):passdef save(username,money):pass
面向对象式编程

# 通过对比可以看出面向对象第一个优点:

面向对象编程:是一类相似功能函数的集合,使你的代码更清晰化,更合理化。

说第二个优点之前,先看看什么是面向对象。

面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。

那什么是类?什么是对象?

类:就是具有相同属性和功能的一类事物。

对象:就是类的具体表现。

具体一些:先解释解释什么是⻋? 有轱辘, 有⽅向盘, 有发动机, 会跑的是⻋. 好. 在解释⼀个. 什么是⼈. 有名字, 年龄, 爱好, 会唱歌跳舞思考的是⼈.那么广义上 车,人就是类:但是具体的我的车,你这个人这是一个对象。

猫,是一类,你们家养的 大橘。

狗,是一类,隔壁家养的那只二哈就是对象。

⾯向对象思维, 要⾃⼰建立对象. ⾃⼰建立场景. 你是就是⾯向对象世界中的上帝. 你想让⻋⼲嘛就⼲嘛. 你想让⼈⼲嘛⼈就能⼲嘛。

再说第二个优点:面向对象,要拥有上帝的视角看问题,类其实就是一个公共模板(厂房),对象就从具体的模板实例化出来(慢慢体会)。

1.3类的结构

class Human:"""此类主要是构建人类"""mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段dic = {}l1 = []def work(self): # 第二部分:方法 函数 动态属性print('人类会工作')
class 是关键字与def用法相同,定义一个类。
Human是此类的类名,类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头。
类的结构从大方向来说就分为两部分:
静态变量。
动态方法。

二. 从类名的角度研究类                              

2.1 类名操作静态属性

   2.11 第一种,查看类中的所有内容类名.__dict__方式。

class Human:"""此类主要是构建人类"""mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段dic = {}l1 = []def work(self): # 第二部分:方法 函数 动态属性# print(self)print('人类会工作')print(Human.__dict__)
print(Human.__dict__['mind'])
Human.__dict__['mind'] = '无脑'
print(Human.__dict__)  # 错误
#通过这种方式只能查询,不能增删改.# 第一种方式只用户查询全部内容(一般不用单独属性查询).

2.12 第二种:万能的点.  

 

class Human:"""此类主要是构建人类"""mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段dic = {}l1 = []def work(self): # 第二部分:方法 函数 动态属性# print(self)print('人类会工作')
print(Human.mind)  #
Human.mind = '无脑'  #
print(Human.mind)
del Human.mind  #
Human.walk = '直立行走'
print(Human.walk)
# 通过万能的点 可以增删改查类中的单个属性

 

对以上两种做一个总结:如果想查询类中的所有内容,通过 第一种__dict__方法,如果只是操作单个属性则用万能的点的方式。

2.2 类名操作动态方法         

  前提:除了两个特殊方法:静态方法,类方法之外,一般不会通过类名操作一个类中的方法。

class Human:"""此类主要是构建人类"""mind = '有思想'  # 第一部分:静态属性 属性 静态变量 静态字段dic = {}l1 = []def work(self): # 第二部分:方法 函数 动态属性# print(self)print('人类会工作')def tools(self):print('人类会使用工具')Human.work(111)
Human.tools(111)
下面可以做,但不用。
Human.__dict__['work'](111)

三. 从对象的角度研究类                               

3.1 什么是对象

对象是从类中出来的,只要是类名加上(),这就是一个实例化过程,这个就会实例化一个对象。

执行下列代码会发生什么事情?

实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征

class Human:mind = '有思想'def __init__(self):print(666)print(self)  # <__main__.Human object at 0x00000191508AA828>def work(self): print('人类会工作')def tools(self):print('人类会使用工具')
obj = Human() # 只要实例化对象,它会自动执行__init__方法
print(obj)  # <__main__.Human object at 0x00000191508AA828>
# 并且obj的地址与self的地址相同

其实实例化一个对象总共发生了三件事:

  1,在内存中开辟了一个对象空间。

  2,自动执行类中的__init__方法,并将这个对象空间(内存地址)传给了__init__方法的第一个位置参数self。

  3,在__init__ 方法中通过self给对象空间添加属性。

示例:

class Human:mind = '有思想'language = '使用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'运动')

3.2 对象操作对象空间属性        

  3.21 对象查询对象中所有属性:  对象.__dict__

class Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'运动')
print(obj.__dict__)  # {'n': 'barry', 'h': '运动', 's': '男', 'a': 18}

3.22 对象操作对象中的单个属性: 万能的点 .

class Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):# self 和 obj 指向的是同一个内存地址同一个空间,下面就是通过self给这个对象空间封装四个属性。self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'运动')
obj.job = 'IT'  #
del obj.n  #
obj.s = '' #
print(obj.s)  #
print(obj.__dict__)

3.3 对象查看类中的属性       

class Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbyobj = Human('barry','',18,'运动')
print(obj.mind)
print(obj.language)
obj.a = 666
print(obj.a)

3.4 对象操作类中的方法   

class Human:mind = '有思想'language = '实用语言'def __init__(self,name,sex,age,hobby):self.n = nameself.s = sexself.a = ageself.h = hobbydef work(self):print(self)print('人类会工作')def tools(self):print('人类会使用工具')obj = Human('barry','',18,'运动')
obj.work()
obj.tools()

类中的方法一般都是通过对象执行的(除去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self.

self 是什么?

 

self其实就是类中方法(函数)的第一个位置参数,只不过解释器会自动将调用这个函数的对象传给self。所以咱们把类中的方法的第一个参数约定俗成设置成self, 代表这个就是对象。

一个类可以实例化多个对象

obj1= Human('小胖','',20,'美女')
obj2= Human('相爷','',18,'肥女')
print(obj1,obj2)
print(obj1.__dict__)
print(obj2.__dict__)

 总结

类名:
1,查看所有方法:类名.__dict__
2,查看类中的静态变量:类名.mind(类名.__dict__['mind']  不建议)
3,查看类中的动态方法:类名.方法名(参数)   #需要传参
对象:
obj = 类名()
1,在内存中创建了一个空间
2,自动执行__init__(self),并将空的对象空间传给self.
3,在__init__方法中,给空的对象空间封装一些属性,并将完善好的这个对象返回给 类名() 这个对象

创造一个对象的流程:
1,首先要创造一个对象,产生一些类对象的指针
2,会自动的触发__init__,将创造出来的对象的地址传给self
3,执行__init__中的代码
4,将self指向的地址再返回给调用者

1,对象查看自己空间的所有属性:
对象.__dict__
2,对象操作自己的属性,万能的点:
对象.属性名(增删改查)
3,对象可以查询类中的静态字段(变量):
对象.静态变量
4,对象可以查询类中的动态方法:
对象.方法名()   #不需要传参

 

转载于:https://www.cnblogs.com/ls13691357174/p/10472230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS逆向:在任意app上开启malloc stack追踪内存来源

lldb有一个内存调试工具malloc stack&#xff0c;开启以后就可以查看某个内存地址的malloc和free记录&#xff0c;追踪对象是在哪里创建的。 这个工具可以打印出对象创建的堆栈&#xff0c;而在逆向时&#xff0c;也经常需要追踪某些方法的调用栈&#xff0c;如果可以随时打印出…

【CH4302】Interval GCD

思路&#xff1a;线段树维护a的差分数组的gcd&#xff0c; 因为$gcd(a_1,a_2,a_3,...,a_n)gcd(a_1,a_2-a_1,a_3-a_2,...,a_n-a_{n-1})$。 原区间修改可以转化为差分数组上的两次单点修改。 因为实际计算时还需要原数&#xff0c;所以用树状数组维护b的增减量。 询问时&#xff…

Vue 的路由实现 Hash模式 和 History模式

Hash 模式: Hash 模式的工作原理是onhashchange事件&#xff0c;Window对象可以监听这个事件... 可以通过改变路径的哈希值&#xff0c;来实现历史记录的保存&#xff0c;发生变化的hash 都会被浏览器给保存下来&#xff0c;所以下次尽管浏览器没有请求服务器&#xff0c;但是还…

我的第一次——网站备案

暂无内容 转载于:https://my.oschina.net/vright/blog/1784979

使用LiveClick升级您的实时书签

If you like to subscribe to feeds using Firefox’s Live Bookmarks feature, the LiveClick extension gives you so many upgrades that I can only cover the highlights of how great it is. 如果您想使用Firefox的“实时书签”功能订阅供稿&#xff0c;则LiveClick扩展程…

操作系统的概论梳理

转载于:https://www.cnblogs.com/hclhechunlu/p/10477470.html

win7下如何显示缅文和使用缅文输入法?

windows 7 操作系统默认不支持缅文&#xff0c;所以缅文在win7上不能显示&#xff0c;当然也没有提供缅文输入法。 一、显示缅文 windows系统下显示缅文字母只需要安装缅文字体就可以了。目前常见的缅文字体就是Zawgyi-One&#xff0c;Zawgyi-One是一种广泛使用的缅文字体。Zaw…

airpods2使用_如何使用AirPods和AirPods Pro:完整指南

airpods2使用Burdun Iliya/ShutterstockBurdun Iliya /快门Just bought yourself or received a new pair of AirPods or AirPods Pro? Welcome to the truly wireless earphones life. Setting up AirPods is quite straightforward, but here’s how to customize and get t…

LANG

修改 /etc/sysconfig/i18n 文件 locale 查看字符集 转载于:https://www.cnblogs.com/todayORtomorrow/p/10479594.html

如何在iPhone上共享视频之前从视频中删除音频

Sometimes, you’d like to share a video with others, but the accompanying audio track is distracting or perhaps introduces privacy concerns. Luckily, there’s a quick way to silence a video using Photos on iPhone and iPad. Here’s how. 有时&#xff0c;您想…

入门第十一课 Python语句的嵌套

1、说个小故事&#xff1a;话说一个人买到一个治疗瘙痒的偏方&#xff0c;在拆开无数层的包装后&#xff0c;得到的只是一张写着“挠挠”的小纸条儿。 嵌套&#xff0c;类似于在一个语句中&#xff0c;嵌套另一个语句。举个栗子-_-!! 我们要计算从1到100之间&#xff0c;所有的…

【TensorFlow篇】--Tensorflow框架实现SoftMax模型识别手写数字集

一、前述 本文讲述用Tensorflow框架实现SoftMax模型识别手写数字集&#xff0c;来实现多分类。 同时对模型的保存和恢复做下示例。 二、具体原理 代码一&#xff1a;实现代码 #!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名: 12_Softmax_regression.pyfrom tensorflow.ex…

web页面锁屏初级尝试

因为工作需要&#xff0c;所以在网上找了一些素材来弄这个功能。在我找到的素材中&#xff0c;大多都是不完善的。虽然我的也不是很完善&#xff0c;但是怎么说呢。要求不是很高的话。可以直接拿来用的【需要引用jQuery】。废话不多说直接上代码 这部分是js代码 1 <script&g…

Java 并发工具箱之concurrent包

概述 java.util.concurrent 包是专为 Java并发编程而设计的包。包下的所有类可以分为如下几大类&#xff1a; locks部分&#xff1a;显式锁(互斥锁和速写锁)相关&#xff1b;atomic部分&#xff1a;原子变量类相关&#xff0c;是构建非阻塞算法的基础&#xff1b;executor部分&…

如何提高gps精度_如何在锻炼应用程序中提高GPS跟踪精度

如何提高gps精度l i g h t p o e t/Shutterstocklightpoet /快门Tracking your runs, bike rides, and other workouts is fun because you can see how much you’re improving (or, in my case, dismally failing to improve). For it to be effective, though, you have to …

centos proftp_在CentOS上禁用ProFTP

centos proftpI realize this is probably only relevant to about 3 of the readers, but I’m posting this so I don’t forget how to do it myself! In my efforts to ban the completely insecure FTP protocol from my life entirely, I’ve decided to disable the FTP…

Java通过Executors提供四种线程池

http://cuisuqiang.iteye.com/blog/2019372 Java通过Executors提供四种线程池&#xff0c;分别为&#xff1a;newCachedThreadPool创建一个可缓存线程池&#xff0c;如果线程池长度超过处理需要&#xff0c;可灵活回收空闲线程&#xff0c;若无可回收&#xff0c;则新建线程。n…

一个在线编写前端代码的好玩的工具

https://codesandbox.io/ 可以编写 Angular&#xff0c;React&#xff0c;Vue 等前端代码。 可以实时编辑和 preview。 live 功能&#xff0c;可以多人协作编辑&#xff0c;不过是收费的功能。 可以增加依赖的包&#xff0c;比如编写 React 时&#xff0c;可以安装任意的第三…

MySQL数据库基础(五)——SQL查询

MySQL数据库基础&#xff08;五&#xff09;——SQL查询 一、单表查询 1、查询所有字段 在SELECT语句中使用星号“”通配符查询所有字段在SELECT语句中指定所有字段select from TStudent; 2、查询指定字段 查询多个字段select Sname,sex,email from TStudent; 3、查询指定记录…

使用生成器创建新的迭代模式

一个函数中需要有一个 yield 语句即可将其转换为一个生成器。 def frange(start, stop, increment):x startwhile x < stop:yield xx incrementfor i in frange(0, 4, 2):print(i) # 0 2 一个生成器函数主要特征是它只会回应在迭代中使用到的 next 操作 def cutdata(n):p…