面向对象初识

一. 面向对象初识    

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,一经查实,立即删除!

相关文章

使用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…

如何在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;您想…

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…

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

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

基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能

NextQRCode ZXing开源库的精简版 **基于ZXing Android实现生成二维码图片和相机扫描二维码图片即时解码的功能原文博客 附源码下载地址** 与原ZXingMini项目对比 NextQRCode做了重大架构修改&#xff0c;原ZXingMini项目与当前NextQRCode不兼容 dependencies {compile com.gith…

如何在Windows 7或Vista上安装IIS

If you are a developer using ASP.NET, one of the first things you’ll want to install on Windows 7 or Vista is IIS (internet information server). Keep in mind that your version of Windows may not come with IIS. I’m using Windows 7 Ultimate edition. 如果您…

ThinkPHP3.2 实现阿里云OSS上传文件

为什么80%的码农都做不了架构师&#xff1f;>>> 0、配置文件Config&#xff0c;加入OSS配置选项&#xff0c;设置php.ini最大上传大小&#xff08;自行解决&#xff0c;这里不做演示&#xff09; OSS > array(ACCESS_KEY_ID > **************, //从OSS获得的…

ipad和iphone切图_如何在iPhone,iPad和Mac上签名PDF

ipad和iphone切图Khamosh PathakKhamosh PathakDo you have documents to sign? You don’t need to worry about printing, scanning, or even downloading a third-party app. You can sign PDFs right on your iPhone, iPad, and Mac. 你有文件要签名吗&#xff1f; 您无需…

在Ubuntu服务器上打开第二个控制台会话

Ubuntu Server has the native ability to run multiple console sessions from the server console prompt. If you are working on the actual console and are waiting for a long running command to finish, there’s no reason why you have to sit and wait… you can j…

Cloudstack系统配置(三)

系统配置 CloudStack提供一个基于web的UI&#xff0c;管理员和终端用户能够使用这个界面。用户界面版本依赖于登陆时使用的凭证不同而不同。用户界面是适用于大多数流行的浏览器包括IE7,IE8,IE9,Firefox Chrome等。URL是:(用你自己的管理控制服务器IP地址代替) 1http://<ma…

如何在Chrome工具栏中固定和取消固定扩展程序

Not all extensions are made equal. Some extensions, like Grammarly, work quietly in the background and don’t need an icon in the Chrome toolbar. Here’s how to pin and unpin extensions for a cleaner Chrome toolbar. 并非所有扩展名都相等。 某些扩展程序(例如…

vim编辑器快捷操作

1、查找 进入编辑器 按下 / 进行查找&#xff0c;回跳到第一个匹配的值&#xff0c;按下n查找下一个 N返回查看上一个 也可根据正则进行查找 2、替换 &#xff1a;s/a/b/g 当前行替换 &#xff1a;%s/a/b/g 全文替换 &#xff1a;5,10s/a/b/g 区域替换: .,2s/foo/bar/g 当…

react-navigation 跨 tabs 返回首页

2019独角兽企业重金招聘Python工程师标准>>> react-navigation 跨 tabs 返回首页 import { NavigationActions } from react-navigation;const navigationAction NavigationActions.reset({ index: 0,actions: [ NavigationActions.navigate({ routeName: RootTab…

ubuntu 默认命令行_从命令行在Ubuntu上设置默认浏览器

ubuntu 默认命令行Ubuntu Linux has a default browser functionality that will automatically launch the correct browser when clicking on a link in a gnome gui application. It’s easy enough to set the default browser using the GUI tools, but sometimes it’s e…