热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python面向对象程序设计案例_python的类(面向对象程序设计OOP)

#类的定义与实例化#Python使用class关键字来定义类classCar(object):#定义一个类,派生自object类definfor(self):#定义成

#类的定义与实例化

#Python使用class关键字来定义类

class Car(object): #定义一个类,派生自object类

def infor(self): #定义成员方法

print("This is a car")

car = Car() #实例化对象

car.infor() #调用对象的成员方法

#可以使用内置函数isinstance()来测试一个对象是否为某个类的实例

print(isinstance(car,Car))

#数据成员和成员方法统称为类的成员,成员又分为私有成员和公有成员

#私有成员:在类的外部不能直接访问,一般是在类的内部进行访问和操作,或者在类的外部通过调用对象的公有成员方法来访问,这是类的封装特性的重要体现。

#在定义类的成员时,如果成员名以两个下划线"__"开头则表示是私有成员,通过"对象名._类名__xxx"也可以在外部访问私有成员,

class A:

def __init__(self, value1=0, value2=0): #构造方法

self._value1 = value1

self.__value2 = value2 #私有成员

def setValue(self, value1, value2): #成员方法,公有成员

self._value1 = value1

self.__value2 = value2 #在类内部可以直接访问私有成员

a = A()

print(a._value1)

print(a._A__value2)

#以下画线开头和结束的成员名有特殊的含义,在类的定义中用下画线作为变量名和方法名前缀和后缀往往表示类的特殊成员。

#_xxx:以一个下画线开头,表示保护成员,不能用"from module import *"导入,只有类对象和子类对象可以访问这些成员。

#__xxx:以两个下画线开头,表示类中私有成员,一般只有类对象自己能访问,子类对象也不能直接访问该成员

#__xxx__:前后各两个下画线,表示系统定义的特殊成员。

#数据成员

#数据成员可以大致分为两类:属于对象的数据成员和属于类的数据成员

#①属于对象的数据成员一般在构造方法__init__()中定义,也可以在其他成员方法中定义,在定义和在实例方法中访问数据成员时往往以self作为前缀,

#同一个类的不同对象(实例)之间的数据成员之间互不影响。

#②属于类的数据成员是该类所有对象共享的,不属于任何一个对象,在定义类时这类数据成员一般不在任何一个成员方法的定义中。

class Car(object):

price = 100000 #属于类的数据成员

def __init__(self, c):

self.color = c #属于对象的数据成员

car1 = Car("red")

car1.price = 19

print(car1.price)

print(car1.color)

#成员方法

#成员方法常有的类型有:公有方法,私有方法,静态方法,类方法和抽象方法(公有方法、私有方法和抽象方法一般是指属于对象的实例方法)

#私有方法:只需要在函数名前加上 "__"两个下划线,声明该方法为私有方法,只能在类内进行调用,不能在类的外部调用

class animal(object):

def printname(self,name):

print(name)

def __printname(self,name): #私有方法,外界无法访问私有方法,但可以在类内部方法私有方法。

print(name)

cat = animal()

cat.printname("TOM")

#cat.__printname("TOM")

#公有方法:一般方法

class animal(object):

def printname(self,name):

print(name)

mouse = animal()

mouse.printname("Jim")

#静态方法:[email protected],静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,逻辑上属于类,

# 但是和类本身没有关系,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是个独立的、单纯的函数,

# 它仅仅托管于某个类的名称空间中,便于使用和维护。

#类方法:[email protected],原则上,类方法是将类本身作为对象进行操作的方法。假设有个方法,且这个方法在逻辑上采用类本身作为对象来调用更合理,

# 那么这个方法就可以定义为类方法。另外,如果需要继承,也可以定义为类方法。

#魔法方法(特殊方法):

#①__init__:初始化函数,在创建实例对象为其赋值时使用。

#②__new__:很多人认为__init__是类的构造函数,其实不太确切,__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函数,

# 创建并返回一个实例对象,如果__new__只调用了一次,就会得到一个对象。

#创建对象的步骤

#a、首先调用__new__得到一个对象

#b、调用__init__为对象添加属性

#c、将对象赋值给变量

#③__class__:获得已知对象的类 ( 对象.__class__)

#④__str__:在将对象转换成字符串 str(对象) 测试的时候,打印对象的信息

#⑤__repr__:如果说__str__体现的是一种可读性,是给用户看的,那么__repr__方法体现的则是一种准确性,是给开发人员看的,

# 它对应的是repr()函数,重构__repr__方法后,在控制台直接敲出实例对象的名称

#⑥__del__:对象在程序运行结束之后进行垃圾回收的时候调用这个方法,来释放资源。

#⑦__getattribute__:属性访问拦截器,在访问实例属性时自动调用。在python中,类的属性和方法都理解为属性,且均可以通过__getattribute__获取。

#⑧__bases__:获取指定类的所有父类构成元素,使用方法为类名.__bases__

#⑨__mro__:显示指定类的所有继承脉络和继承顺序,假如这个指定的类不具有某些方法和属性,但与其有血统关系的类中具有这些属性和方法,则在访问这个类本身不具有的这些方法和属性时,

# 会按照__mro__显示出来的顺序一层一层向后查找,直到找到为止。

#⑩__call__:具有__call__魔法方法的对象可以使用XXX()的形式被调用,比如说类的实例对象

class Entity:

‘‘‘调用实体来改变实体的位置。‘‘‘

def __init__(self, size, x, y):

self.x, self.y = x, y

self.size = size

def __call__(self, x, y):

‘‘‘改变实体的位置‘‘‘

self.x, self.y = x, y

e = Entity(1, 2, 3) # 创建实例

print(e.x)

print(e.y)

e(4, 5) #实例可以象函数那样执行,并传入x y值,修改对象的x y

print(e.x)

print(e.y)

#__slots__:可以限制实例对象的属性和方法,但是对类不起作用。

#继承的好处:设计一个新类时,如果可以继承一个已有的、设计良好的类然后进行二次开发,可以大幅度减少开发工作量,并且可以很大程度保证质量。

#在继承关系中,已有的、设计好的类称为父类,新设计的类称为子类。子类可以继承父类的公有成员,但是不能继承其私有成员。

#如果需要在子类中调用父类的方法,可以使用内置函数super()或者通过“父类名.方法名()”的方式来实现这一目的。

#例:设计Person类,并根据Person派生Teachet类,分别创建Person类与Teachet类的对象。

#父类

#父类必须继承于object,否则在子类中将无法使用super()函数

class Person(object):

def __init__(self, name=‘‘, age=20, sex=‘man‘):

#通过调用方法进行初始化,这样对参数进行更好的控制

self.setName(name)

self.setAge(age)

self.setSex(sex)

def setName(self, name):

if not isinstance(name, str):

raise Exception(‘name must be string.‘)

self.__name = name

def setAge(self, age):

if type(age) != int:

raise Exception(‘age must be integer.‘)

self.__age = age

def setSex(self, sex):

if sex not in (‘man‘, ‘woman‘):

raise Exception(‘sex must be "man" or "woman"‘)

self.__sex = sex

def show(self):

print(self.__name ,self.__age, self.__sex, end=‘‘)

#子类

class Teacher(Person):

def __init__(self, name=‘‘, age=30, sex=‘man‘, department=‘Computer‘):

#调用基类构造方法,初始化基类的私有数据成员

super(Teacher, self).__init__(name, age, sex)

#也可以这样初始化基类的私有数据成员

#Person.__init__(self, name, age, sex)

#初始化派生类的数据成员

self.setDepartment(department)

def setDepartment(self, department):

if type(department) != str:

raise Exception(‘department must be a string‘)

self.__department = department

def show(self):

super(Teacher, self).show()

print(self.__department)

if __name__ == ‘__main__‘:

#创建基类对象

zhangsan = Person(‘Zhang San‘, 19, ‘man‘)

zhangsan.show()

print(‘\n‘, ‘=‘ * 30)

#创建派生类对象

lisi = Teacher(‘Li si‘, 32, ‘man‘, ‘Match‘)

lisi.show()

#调用继承的方法修改年龄

lisi.setAge(40)

lisi.show()

原文:https://www.cnblogs.com/xhw19950606/p/12273100.html



推荐阅读
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 如何使用 `org.apache.tomcat.websocket.server.WsServerContainer.findMapping()` 方法及其代码示例解析 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • Python进阶笔记:深入理解装饰器、生成器与迭代器的应用
    本文深入探讨了Python中的装饰器、生成器和迭代器的应用。装饰器本质上是一个函数,用于在不修改原函数代码和调用方式的前提下为其添加额外功能。实现装饰器需要掌握闭包、高阶函数等基础知识。生成器通过 `yield` 语句提供了一种高效生成和处理大量数据的方法,而迭代器则是一种可以逐个访问集合中元素的对象。文章详细解析了这些概念的原理和实际应用案例,帮助读者更好地理解和使用这些高级特性。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
author-avatar
大狗nonodq_284
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有