面向对象的代码实现

一、类的声明

类的声明使用class关键字,类名需要注意,使用大驼峰命名法,不同单词首字母大写:

class Person:        # 大驼峰命名法def __init__(self, name, age, gender):"""初始化方法,创建对象时会自动执行实体的属性可以在这里声明"""self.name = name           # 初始化实例属性self.age = age             # 初始化实例属性self.gender = gender       # 初始化实例属性

二、创建对象

创建对象的语法是:对象=类名(对象属性)
创建对象时需要注意对象属性需要传参,可以通过位置参数传参,也可以通过关键字参数传参。

创建对象并调用属性:

class Person:        # 大驼峰命名法def __init__(self, name, age, gender):"""初始化方法,创建对象时会自动执行实体的属性可以在这里声明"""self.name = name           # 初始化实例属性self.age = age             # 初始化实例属性self.gender = gender       # 初始化实例属性# 创建对象
xiaoming = Person("小明", 18, "男")
# 调用属性
print(xiaoming.name)
print(xiaoming.age)
print(xiaoming.gender)

三、方法声明

面向对象编程中,对象的方法以函数的形式表现。

class Person:        # 大驼峰命名法def __init__(self, name, age, gender):"""初始化方法,创建对象时会自动执行实体的属性可以在这里声明"""self.name = name           # 初始化实例属性self.age = age             # 初始化实例属性self.gender = gender       # 初始化实例属性def study(self):"""这是声明的学习方法"""print("创建对象后对象就包含了这个学习方法")# 创建一个对象
xiaoming = Person("小明", 18, "男")
# 通过对象调用方法
xiaoming.study()

四、self关键字

在上面的代码中,我们可以发现在创建属性和方法的时候都有一个self,那么这个self是干嘛的呢?
self其实就是表示对象自己的意思。这里我们可以借鉴初始化方法中的self.name = name;前面的self.name和xiaoming.name的结构是不是很像?这就说明了self和对象是有关系的,self就是对象自己。

五、案例描述

通过面向过程来实现小明背着书包去上学

# 通过函数实现小明背着书包去上学
def carry_schoolbag(name):"""定义背书包函数"""print(f"{name}背起了他可爱的奥特曼书包")def go_to_school(name):"""定义上学的函数"""print(f"{name}快步流星的上学去了,快迟到了")def event():"""最终事件完成版"""name = "小明"carry_schoolbag(name)    # 按照过程调用背书包函数go_to_school(name)       # 按照过程调用上学函数event()

通过面向对象来实现小明背着书包去上学的事件:

# 通过面向对象实现小明背着书包去上学
class Person:"""声明一个人的类,小明属于这个类"""def __init__(self, name, age, eye_color):self.name = nameself.age = ageself.eye_color = eye_colordef go_to_school(self, schoolbag, school):"""上学行为"""print(f"{self.name}准备上学了")print(f"他背着{schoolbag.color}的带有{schoolbag.pattern}图案的书包")print(f"快步流星地向{school.name}走去")class Schoolbag:"""声明一个书包的类"""def __init__(self, color, pattern):self.color = colorself.pattern = pattern       # pattern是图案的意思class School:"""声明一个学校类"""def __init__(self, name):self.name = name# 创建对象:小明、书包、学校
xiaoming = Person("小明", 18, "black")
schoolbag = Schoolbag("蓝色", "奥特曼")
school = School("希望中学")# 调用小明的上学行为,完成上学事件
xiaoming.go_to_school(schoolbag, school)

六、类属性和实例属性

面向对象的编程中,属性一共有两种。一种是实例属性,还有一种是类属性。
(一)实例属性
实例属性我们已经见到过了,就是在初始化方法中的相关属性就是实例属性。每个对象的实例属性只能被这个对象访问,其他的对象或者类都不可以访问

实例属性的扩展问题:
当一个实例被创建之后,那么他就含有在类中初始化方法定义的实例属性。
但是这个实例可以通过实例名.新属性 = 新属性的值,来拥有属于自己的,独一无二的属性,这就叫实例属性扩展。

class Person:        # 大驼峰命名法describe = "人类是智慧最高的动物"    # 声明类属性def __init__(self, name, age, gender):"""初始化方法,创建对象时会自动执行实体的属性可以在这里声明"""self.name = name           # 初始化实例属性self.age = age             # 初始化实例属性self.gender = gender       # 初始化实例属性# 创建两个对象
Mike = Person("Mike", 21, "男")
Amy = Person("Amy", 19, "女")
# 实例属性扩展
Mike.hair = "gold"
# 访问新属性
print(Mike.hair)    # gold
print(Amy.hair)     # 报错;'Person' object has no attribute 'hair'

因此每个实例之间的属性有可能不一样。在项目开发的时候,如果不同对象的属性名不一致的话,会对项目开发造成阻碍,这个就是实例属性扩展问题。
为了避免这种问题,在项目开发的时候会约定俗成项目中只能出现什么属性,以此规避实例属性扩展问题。或者使用__slots__()方法限制当前对象只能包含那些属性,包括__init__()方法中的属性。

# 属性限制
__slots__ = [name, age, gender, hair]

(二)类属性
1、类属性,顾名思义就是类型的属性,属于类的特征。
①类属性可以被当前类型名称访问,可以被当前类型的所有对象访问;不可以被当前类型以外的对象和类访问。
②类属性可通过类型名称进行修改,不可以被对象名称进行修改
类属性有点类似全局变量,全局变量是可以被整个程序中的所有对象进行访问,而类属性只允许当前类中的对象进行访问。两者性质不一样。
2、类属性的声明
我们这里使用最开始的例子进行演示

class Person:        # 大驼峰命名法describe = "人类是智慧最高的动物"  # 声明类属性def __init__(self, name, age, gender):"""初始化方法,创建对象时会自动执行实体的属性可以在这里声明"""self.name = name           # 初始化实例属性self.age = age             # 初始化实例属性self.gender = gender       # 初始化实例属性

类属性声明的位置在类的内部,方法的外部。
3、类属性的使用

class Person:        # 大驼峰命名法describe = "人类是智慧最高的动物"    # 声明类属性def __init__(self, name, age, gender):"""初始化方法,创建对象时会自动执行实体的属性可以在这里声明"""self.name = name           # 初始化实例属性self.age = age             # 初始化实例属性self.gender = gender       # 初始化实例属性# 创建一个对象
Mike = Person("Mike", 21, "男")
# 通过类名称访问类属性
print(Person.describe)     # 人类是智慧最高的动物
# 通过对象名访问类属性
print(Mike.describe)      # 人类是智慧最高的动物
# 通过类名修改类属性
Person.describe = "通过类名修改类属性"
print(Person.describe)     # 通过类名修改类属性
# 通过对象名修改类属性
Mike.describe = "通过对象名修改类属性"
print(Mike.describe)       # 通过对象名修改类属性
print(Person.describe)     # 通过类名修改类属性

最后的输出结果

通过最后两个的输出结果,我们可以发现,为什么通过对象名修改了类属性,在通过类名重新访问类属性的时候却没有修改呢?
这是因为在创建对象的时候,对象中也会含有一个从类中继承过来的属性describe,对象中的describe和类中的describe其实是两个东西,不过是表现的名字一样,就好像你去笔记本公司买了一台笔记本电脑,这个笔记本电脑是属于你的,笔记本公司的电脑虽然和你的一样,但是你对你自己的电脑安装了软件是不会影响到笔记本公司他们未出售的电脑。所以通过对象名修改类属性是不可取的,因为除了对象本身存在影响,不会影响其他的东西。

七、魔法方法

类型中存在这一种特殊的方法,这些方法都是双下划线开头和结尾的,分别执行一些特定的、重要的功能,这样的方法就是魔法方法。
(由于不知名原因导致了表格中的魔法方法下划线丢失,正确的格式,请参考图片或者代码)
1、对象的构建

魔法方法 描述
new(cls) 创建对象自动调用
init(self) 给创建的对象属性赋值,自动调用

cls表示当前类,self表示创建的对象

class Animal:"""这是一个动物类"""# __new__(cls)方法,使用万能参数接收创建对象时传进来的参数def __new__(cls, *args, **kwargs):print("这是自动执行的创建对象的方法")return object.__new__(cls)         # 需要返回父类object的__new__()方法,cls表示当前类# __init__(self)方法def __init__(self, name):print("这是初始化方法,创建对象时自动执行")self.name = namecat = Animal("tom")

2、对象的打印

魔法方法 描述
str(self) 直接print(对象引用变量)时
自定义输出字符串数据
repr(self) 当其他对象引用使用当前对象时
打印展示自定义字符串数据

当str方法不存在时,直接打印对象会自动找到repr方法

class Animal:"""这是一个动物类"""# __new__(cls)方法,使用万能参数接收创建对象时传进来的参数def __new__(cls, *args, **kwargs):print("这是自动执行的创建对象的方法")return object.__new__(cls)         # 需要返回父类object的__new__()方法,cls表示当前类# __init__(self)方法def __init__(self, name):print("这是初始化方法,创建对象时自动执行")self.name = name# __str__(self)方法def __str__(self):print("这是当直接打印对象引用变量时所输出的内容")return f"这是地球大家庭中的一员"# __repr__(self)方法def __repr__(self):print("这是被其他对象引用时,才会被调用的方法")return f"我被其他对象调用了,我现在的名字是{self.name}"cat = Animal("tom")
print(cat)
a = [cat]        # 这是被其他对象引用时,才会被调用的方法
print(a)        # [我被其他对象调用了,我现在的名字是tom]



3、对象的比较

魔法方法 描述
gt(self, other) gt:grand than 等价于>
判断当前对象是否大于other对象
lt(self, other) lt:less than 等价于<
判断当前对象是否x小于other对象
ge(self, other) ge:grand equal 等价于>=
判断当前对象是否大于或等于other对象
le(self, other) le:less equal 等价于<=
判断当前对象是否小于或等于other对象
eq(self, other) eq:equal 等价于==
判断当前对象是否等于other对象
ne(self, other) ne:not equal 等价于!=
判断当前对象是否不等于other对象
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __gt__(self, other):if self.age > other.age:return Truereturn Falsexiaomo = Person("xiaomo", 20)
xiatian = Person("夏天", 18)
print(xiaomo > xiatian)


4、对象的四则运算

魔法方法 描述
add(self, other) +
sub(self, other) -
mul(self, other) *
div(self, other) /
floordiv(self, other) //
pow(self, other) **
    def __add__(self, other):"""加法"""return self.age + other.age


5、增量运算符

魔法方法 描述
iadd(self, other) +=
isub(self, other) -=
imul(self, other) *=
idiv(self, other) /=
ifloordiv(self, other) //=
ipow(self, other) **=

6、对象的函数式调用
该方法可能会出面试题
面试题:python语言是同时支持面向过程和面向对象的吗?能不能通过代码给我直接体现一下面向对象中对于面向过程的支持。

魔法方法 描述
call(self) 让对象可以类似函数的方式直接调用执行

深入了解新朋友——面向对象相关推荐

  1. HDU-1268 找新朋友 (素数筛选)

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. hdu 1286 找新朋友 欧拉函数模版题

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Des ...

  3. 找新朋友(欧拉函数)

    新年快到了,"猪头帮协会"准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新 ...

  4. 计算机认识新朋友教案,小班教案认识新朋友

    幼儿园的小朋友刚刚入园要多认识新的朋友!下面是应届毕业生小编为大家介绍小班教案认识新朋友,欢迎大家阅读,希望能帮到您! 活动目标: 1.知道幼儿园里有许多小朋友,愿意和大家一起做游戏. 2.能关注到其 ...

  5. HDU 1286 找新朋友 (欧拉函数)

    找新朋友 http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=2&sectionid=1&problemid=8 T ...

  6. 杭电1286找新朋友

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  7. HDOJ 1286 HDU 1286 找新朋友 ACM 1286 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目描述:          http://acm.hdu.edu.cn/showproblem.php?pid=1286 ...

  8. HDU1286 找新朋友【欧拉函数】

    找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...

  9. 计算机认识新朋友教案,认识新朋友教案

    在幼儿园,我们会认识到很多的小伙伴,小班教案认识新朋友.是否很期待的呢.小班教案认识新朋友,欢迎阅读.小班教案认识新朋友一:活动目标:1.开始熟悉同伴.2.学习交朋友的方法.活动准备:挂图<认识 ...

最新文章

  1. 四维偏序 CDQ套CDQ
  2. linux延时与定时操作
  3. Team Foundation Server (TFS) 2015 安装指导
  4. 福字背景|传统中国风国潮设计必备素材!
  5. linux模块builtin是什么意思,Linux命令手册
  6. 浅入深出Vue:数据渲染
  7. mysql 5.7.14 在 windows 下的配置
  8. 奇妙生活-神奇的数字-1的故事
  9. python wps linux_体验WPS for Linux
  10. 信号与系统【奥本海目】第二版笔记
  11. R语言rvest包网络爬虫
  12. dom4j 学习 -- 封装dom4j工具类+如何使用dom4j解析
  13. 经常用电脑辐射大怎么办?这5个习惯可以防辐射
  14. pytorch浅谈——stack()函数
  15. 《Linux内核修炼之道》精华分享与讨论(14)——内核中的链表
  16. [附源码]计算机毕业设计Python基于微信小程序的网络办公系统(程序+源码+LW文档)
  17. 新浪企业邮箱服务器怎么设置,新浪企业邮箱|客户端使用
  18. 乡村学校少年宫计算机课程安排,乡村学校少年宫计算机课程安排.doc
  19. 截取上传flv文件中其中一帧图片
  20. uniapp移动端禁止页面横向拖动滑动

热门文章

  1. http系列之-核心内容
  2. Hbuilder X APP开发 iPhoneX以上型号屏幕适应问题
  3. 乌镇峰会丨容联云:统一AI基础设施 形成AI生产与共享闭环机制
  4. Java实现字母去重
  5. MBR膜是什么?起到哪些用途?-世来福
  6. 永安行专利侵权胜诉,IPO并未搁置
  7. linux模拟usb发包,Linux下USB模拟ps2鼠标驱动
  8. 唤醒计算机教案,智慧课堂教学软件常态化丨镇江中山路实验小学用 智慧“唤醒”课堂...
  9. android基础知识——从头开始
  10. EJB:First component in name xxx not found - Java / Java EE