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

python设计一个circle类_Python入门类class提高篇

一、python类中的访问限制(常用)1、属性的访问限制,Python私有属性Python类中如果有属性不希望被外部访问,

一、python类中的访问限制(常用)

1、属性的访问限制,Python 私有属性

Python 类中如果有属性不希望被外部访问,我们可以在属性命名时以双下划线开头( __ ),那么该属性就不能使用原变量名访问,使得该属性变为本类私有的(伪私有)。

但,如果一个属性以"__xxx__"的形式定义,那么它可以被外部访问。以"__xxx__"定义的属性在 Python 的类中是特殊属性,有很多预定义的特殊属性都是以“__xxx__”定义,所以我们不要把普通属性用"__xxx__" 定义。

以单下划线开头的属性"_xxx",虽然也可以被外部访问,但,按照习惯,他们不应该被外部访问,遵照编码规范我们也不该在外部访问 _xx 或 __xx 属性。

补充说明:加双下划线__xx 的属性,可以通过“ _类名__xx ”可以访问到属性的值。

如下圆类Circle的示例,我们将pi属性开头加上双下划线变成私有属性:

class Circle(object):

__pi = 3.14

def __init__(self, r):

self.r = r

def area(self):

"""圆的面积"""

return self.r **2* self.__pi

circle1 = Circle(1)

print(Circle.__pi) # 抛出AttributeError异常

print(circle1.__pi) # 抛出AttributeError异常通过 Circle.__pi 与 circle1.__pi 访问 __pi 时 都会出现 AttributeError 异常,证明访问权限已被控制。

那么是不是我们就不能访问 __pi 变量?不是,其实还是可以访问 __pi ,可以通过 Circle._Circle__pi 访问到 __pi 属性,为什么能这么访问这里不多讲,他与python的机制有关。

按照编码规范,他们不应该使用Circle._Circle__pi 访问到__pi属性。

2、方法的访问限制,Python私有访问

同属性的访问限制,方法的访问限制也是在方法名前加双下划线 ( __ ),它也是一种伪私有。

示例:

class Circle(object):

__pi = 3.14

def __init__(self, r):

self.r = r

def area(self):

"""圆的面积"""

return self.r**2 * self.__pi

def __girth(self):

"""圆的周长"""

return 2*self.r * self.__pi

circle1 = Circle(2)

print(circle1.__girth()) # 抛出AttributeError异常私有化方法后,我们只能在类的内部使用该方法,不能被外部调用。

同属性控制,方法需要访问被限制的方法也是 _类名__xx 如 circle1._Circle__girth()。

二、Python类中的@classmethod、@staticmethod 装饰方法(比较难,需要理解)

@classmethod用来修饰方法。使用在实例化前与类进行交互,但不和其实例进行交互的函数方法上。

@staticmethod用来修饰类的静态方法。使用在有些与类相关函数,但不使用该类或该类的实例。如更改环境变量、修改其他类的属性等。

两者最明显的区别,classmethod 必须使用类的对象作为第一个参数,而staticmethod则可以不传递任何参数

1、@classmethod 类方法

类方法,我们不用通过实例化类就能访问的方法。而且@classmethod 装饰的方法不能使用实例属性,只能是类属性。它主要使用在和类进行交互,但不和其实例进行交互的函数方法上。

下面,我们要写一个只在类中运行而不在实例中运行的方法。

简单示例,读取私有化类属性数据,如下:

class Circle(object):

__pi = 3.14

def __init__(self, r):

self.r = r

@classmethod

def pi(cls):

return cls.__pi

def area(self):

"""圆的面积"""

return self.r ** 2 * self.__pi

print(Circle.pi()) # 没有实例化 能直接访问pi() 方法

circle1 = Circle(2)

print(circle1.pi()) # 也可以通过实例访问pi()方法Circle类下的pi()方法被 @classmethod 装饰后,我们能通过Circle.pi() 直接运行方法,不用实例化类。

示例:重构构造__init__() 方法应用, 格式化创建时间实例

class Date(object):

day = 0

month = 0

year = 0

def __init__(self, year=0, month=0, day=0):

self.day = day

self.month = month

self.year = year

@classmethod

def from_string(cls, date_as_string):

year, month, day = date_as_string.split('-')

date = cls(year, month, day)

return date

date1 = Date.from_string('2017-10-17') # 直接使用固定格式的字符串就能创建Date的实例

print(date1.year, date1.month, date1.day)from_string 返回的是Date类的实例,所以我们可以通过from_string 实例化类。

注意:from_string(cls, date_as_string)中cls表示的是类,它和self类实例有一定的差别。类方法中都是使用cls,实例方法中使用self。

2、@staticmethod 静态方法

@staticmethod 和@classmethod非常的相似,但是@staticmethod 不强制要求传递参数(它做的事与类方法或实例方法一样)。

@staticmethod使用在有些和类相关函数,但不使用该类或者该类的实例。如更改环境变量、修改其他类的属性等。

一句话@staticmethod 修饰的方法是放在类外的函数,我们为了方便将他移动到了类里面,它对类的运行无影响。

示例:

class Date(object):

day = 0

month = 0

year = 0

def __init__(self, year=0, month=0, day=0):

self.day = day

self.month = month

self.year = year

@classmethod

def from_string(cls, date_as_string):

year, month, day = date_as_string.split('-')

date = cls(year, month, day)

return date

@staticmethod

def is_date_valid(date_as_string):

"""用来校验日期的格式是否正确"""

year, month, day = date_as_string.split('-')

return int(year) <&#61; 3999 and int(month) <&#61; 12 and int(day) <&#61; 31

date1 &#61; Date.from_string(&#39;2012-05-10&#39;)

print(date1.year, date1.month, date1.day)

is_date &#61; Date.is_date_valid(&#39;2012-09-18&#39;) # 格式正确 返回True

is_date_valid(date_as_string) 只有一个参数&#xff0c;它的运行不会影响类的属性&#xff0c;注意&#xff1a;&#64;staticmethod修饰方法 is_date_valid(date_as_string)中无实例化参数self或者cls&#xff1b;而&#64;classmethod修饰的方法中有from_string(cls, date_as_string) 类参数cls。

三、Python 的 property 使用

property 的有两个作用作为装饰器 &#64;property 将类方法转换为类属性&#xff08;只读&#xff09;

property 重新实现一个属性的 setter 和 getter 方法

1、&#64;property 将类方法转换为只读属性&#xff08;常用&#xff09;

使用 property 的最简单的方法是将它作为装饰器来使用。这可以让你将一个类方法转变成一个类属性。

示例&#xff1a;

class Circle(object):

__pi &#61; 3.14

def __init__(self, r):

self.r &#61; r

&#64;property

def pi(self):

return self.__pi

circle1 &#61; Circle(2)

print(circle1.pi)

circle1.pi&#61;3.14159 # 出现AttributeError异常上面示例装饰了pi方法&#xff0c;创建实例后我们可以使用circle1.pi 自己获取方法的返回值&#xff0c;而且他只能读不能修改。

2、property 重新实现 setter 和 getter 方法&#xff08;少用&#xff09;

示例1&#xff1a;&#xff08;用得较少&#xff09;

class Circle(object):

__pi &#61; 3.14

def __init__(self, r):

self.r &#61; r

def get_pi(self):

return self.__pi

def set_pi(self, pi):

Circle.__pi &#61; pi

pi &#61; property(get_pi, set_pi)

circle1 &#61; Circle(2)

circle1.pi &#61; 3.14 # 设置 pi的值

print(circle1.pi) # 访问 pi的值正如你所看到的&#xff0c;当我们以这种方式使用属性函数时&#xff0c;它允许pi属性设置并获取值本身而不破坏原有代码。让我们使用属性装饰器来重写这段代码&#xff0c;看看我们是否能得到一个允许设置的属性值。

示例2&#xff1a;&#xff08;用得比示例1多&#xff09;

class Circle(object):

__pi &#61; 3.14

def __init__(self, r):

self.r &#61; r

&#64;property

def pi(self):

return self.__pi

&#64;pi.setter

def pi(self, pi):

Circle.__pi &#61; pi

circle1 &#61; Circle(2)

circle1.pi &#61; 3.14 # 设置 pi的值

print(circle1.pi) # 访问 pi的值

把一个方法变成属性&#xff0c;只需要加上 &#64;property 就可以了&#xff0c;如上此时 pi(self) 方法&#xff0c;&#64;property 本身又创建了另一个装饰器 &#64;pi.setter&#xff0c;负责用 setter 方法给属性赋值&#xff0c;于是&#xff0c;将&#64;pi.setter加到 pi(self, pi) 上&#xff0c;我们就拥有一个可控的属性操作。

Python 类入门

2020年4月15日 第一次修改&#xff0c;内容优化



推荐阅读
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入理解Java中的多态性概念及其应用
    多态是面向对象编程中的三大核心特性之一,与封装和继承共同构成了面向对象的基础。多态使得代码更加灵活和可扩展,封装和继承则为其提供了必要的支持。本文将深入探讨多态的概念及其在Java中的具体应用,帮助读者全面理解和掌握这一关键知识点。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 在C#编程中,设计流畅的用户界面是一项重要的任务。本文分享了实现Fluent界面设计的技巧与方法,特别是通过编写领域特定语言(DSL)来简化字符串操作。我们探讨了如何在不使用`+`符号的情况下,通过方法链式调用来组合字符串,从而提高代码的可读性和维护性。文章还介绍了如何利用静态方法和扩展方法来实现这一目标,并提供了一些实用的示例代码。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 出库管理 | 零件设计中的状态模式学习心得与应用分析
    出库管理 | 零件设计中的状态模式学习心得与应用分析 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
author-avatar
呆保保_369
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有