首页 > 编程语言 >玩转Python属性和方法,成为高手不再难!

玩转Python属性和方法,成为高手不再难!

时间:2023-07-30 11:36:01浏览次数:42  
标签:__ 高手 Python self 实例 radius 玩转 方法 属性

导言

Python是一种简洁而强大的编程语言,其支持面向对象的编程范式。在Python中,属性和方法是面向对象编程的核心概念之一。本文将从入门到精通介绍Python中的属性和方法,帮助你深入了解这些重要的概念,并学会如何在实际开发中灵活应用它们。

1. 属性是什么?

属性是对象的特性或数据,可以通过点(.)操作符来访问。在Python中,有两种类型的属性:实例属性和类属性。

1.1 实例属性

实例属性属于类的实例,每个实例都有自己的副本。可以在类的__init__方法中进行初始化。

class Person:
    def __init__(self, name, age):
        self.name = name  # 实例属性name
        self.age = age    # 实例属性age

# 创建Person实例
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

# 访问实例属性
print(person1.name)  # 输出: "Alice"
print(person2.age)   # 输出: 25

1.2 类属性

类属性属于类本身,所有实例共享同一个属性副本。通常在类的顶层进行定义。

class Car:
    # 类属性
    wheels = 4

    def __init__(self, make, model):
        self.make = make  # 实例属性make
        self.model = model  # 实例属性model

        # 创建Car实例
car1 = Car("Toyota", "Camry")
car2 = Car("Honda", "Civic")

# 访问类属性
print(car1.wheels)  # 输出: 4
print(car2.wheels)  # 输出: 4

1.3 属性访问器和修改器(Getter和Setter)

属性访问器(Getter)和修改器(Setter)是用来访问和修改属性的特殊方法。使用它们可以在访问属性时进行额外的逻辑处理。

class Circle:
    def __init__(self, radius):
        self._radius = radius  # 私有属性,约定使用下划线开头

    # 属性访问器(Getter)
    @property
    def radius(self):
        return self._radius

    # 属性修改器(Setter)
    @radius.setter
    def radius(self, value):
        if value >= 0:
            self._radius = value
        else:
            raise ValueError("半径不能为负数")

# 创建Circle实例
circle = Circle(5)

# 使用属性访问器获取半径
print(circle.radius)  # 输出: 5

# 使用属性修改器设置半径
circle.radius = 10
print(circle.radius)  # 输出: 10

# 尝试设置负数半径,将会引发ValueError
circle.radius = -1

在上述代码中,我们使用@property装饰器定义了一个名为radius的属性访问器,用于获取_radius的值。同时,使用@radius.setter装饰器定义了属性修改器,用于设置_radius的值。这样,我们可以像访问普通属性一样使用circle.radius来获取和设置_radius的值。

2. 方法是什么?

方法是类中定义的函数,用于执行特定的操作。在Python中,有三种类型的方法:实例方法、类方法和静态方法。

2.1 实例方法

实例方法是最常见的方法类型,其第一个参数通常为self,表示对类的实例进行操作。

class Dog:
    def __init__(self, name):
        self.name = name

        # 实例方法
    def bark(self):
        return "汪汪!我是" + self.name

        # 创建Dog实例
dog = Dog("小白")

# 调用实例方法
print(dog.bark())  # 输出: "汪汪!我是小白"

2.2 类方法

类方法是使用@classmethod装饰器定义的方法,在调用时,Python会将类本身传递给第一个参数(通常命名为cls),表示对类进行操作。

class MathUtils:
    PI = 3.1415926

    # 类方法
    @classmethod
    def circle_area(cls, radius):
        return cls.PI * radius * radius

# 调用类方法
area = MathUtils.circle_area(5)
print(area)  # 输出: 78.539815

在上述代码中,我们使用类方法circle_area计算圆的面积,注意我们在类方法中可以使用类的属性cls.PI。

2.3 静态方法

静态方法是使用@staticmethod装饰器定义的方法,它不需要特殊的参数(如self或cls)。静态方法与类和实例无关,通常用于执行与类相关的实用函数。

class StringUtils:
    # 静态方法
    @staticmethod
    def is_palindrome(s):
        return s == s[::-1]

# 调用静态方法
result = StringUtils.is_palindrome("level")
print(result)  # 输出: True

在上述代码中,我们使用静态方法is_palindrome检查给定的字符串是否为回文。

3. 属性与方法的装饰器

属性和方法的装饰器是Python中用于对属性和方法进行额外操作的特殊注解。装饰器能够简化代码、提高代码的复用性,并使代码更加优雅。本节将介绍三种常用的装饰器:@property、@classmethod和@staticmethod。

3.1 @property装饰器

@property装饰器用于将一个方法转换为只读属性,使得我们可以像访问属性一样访问这个方法,而无需使用括号。

class Circle:
    def __init__(self, radius):
        self._radius = radius  # 私有属性,约定使用下划线开头

    # 属性访问器(Getter)
    @property
    def radius(self):
        return self._radius

    # 计算圆的面积
    def area(self):
        return 3.14159 * self._radius * self._radius

# 创建Circle实例
circle = Circle(5)

# 使用属性访问器获取半径
print(circle.radius)  # 输出: 5

# 使用方法计算圆的面积
print(circle.area())  # 输出: 78.53975

# 使用属性访问器获取面积(注意:这里不需要加括号)
print(circle.area)  # 输出: <bound method Circle.area of <__main__.Circle object at 0x...>>

在上述代码中,我们定义了一个Circle类,其中area方法用于计算圆的面积,@property装饰器将radius方法转换为只读属性。使用@property装饰器后,我们可以像访问属性一样访问circle.radius获取圆的半径。

3.2 @classmethod装饰器

@classmethod装饰器用于定义类方法,类方法的第一个参数通常命名为cls,表示对类本身进行操作。

class MathUtils:
    PI = 3.1415926

    # 类方法
    @classmethod
    def circle_area(cls, radius):
        return cls.PI * radius * radius

# 调用类方法
area = MathUtils.circle_area(5)
print(area)  # 输出: 78.539815

在上述代码中,我们定义了一个MathUtils类,其中的circle_area方法是一个类方法,用于计算圆的面积。在类方法内部,我们可以通过cls访问类的属性和方法。

3.3 @staticmethod装饰器

@staticmethod装饰器用于定义静态方法,静态方法与类和实例无关,通常用于执行与类相关的实用函数。

class StringUtils:
    # 静态方法
    @staticmethod
    def is_palindrome(s):
        return s == s[::-1]

# 调用静态方法
result = StringUtils.is_palindrome("level")
print(result)  # 输出: True

在上述代码中,我们定义了一个StringUtils类,其中的is_palindrome方法是一个静态方法,用于判断给定的字符串是否为回文。
总结一下,装饰器是Python中强大且灵活的特性,它们可以在不修改原始代码的情况下,为属性和方法添加额外的功能。@property装饰器用于将方法转换为只读属性,@classmethod装饰器用于定义类方法,@staticmethod装饰器用于定义静态方法。在使用装饰器时,要根据具体的需求选择合适的装饰器类型,以提高代码的可读性和可维护性。

4. 属性和方法的继承

在Python中,子类可以继承父类的属性和方法。子类可以在继承的基础上进行扩展和修改,或者覆盖父类的方法。

class Animal:
    def __init__(self, species):
        self.species = species

    def make_sound(self):
        return "吱吱"  # 默认动物叫声

class Dog(Animal):
    def __init__(self, name):
        super().__init__("犬科")
        self.name = name

        # 重写make_sound方法
    def make_sound(self):
        return "汪汪!我是" + self.name

        # 创建Dog实例
dog = Dog("小白")

# 调用继承的方法
print(dog.species)   # 输出: "犬科"

# 调用子类的方法(覆盖了父类的方法)
print(dog.make_sound())  # 输出: "汪汪!我是小白"

在上述代码中,我们定义了一个Animal类,它有一个实例属性species和一个实例方法make_sound。然后,我们定义了一个Dog类,它继承了Animal类,并且在子类中重写了make_sound方法。

5. 特殊方法(魔术方法)

特殊方法,也被称为魔术方法,以双下划线__开头和结尾。它们是Python中用于实现类的特殊行为的方法。

5.1 __init__方法

__init__方法是构造函数,在创建对象时自动调用,用于对对象进行初始化。
(以下示例在实例方法部分已经有过示例,这里不再重复。)

5.2 __str__方法

__str__方法返回对象的字符串表示,可用于自定义对象在print函数中的输出。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

        # 自定义__str__方法
    def __str__(self):
        return f"{self.name},{self.age}岁"

        # 创建Person实例
person = Person("Alice", 30)

# 调用print函数输出对象
print(person)  # 输出: "Alice,30岁"

在上述代码中,我们定义了一个Person类,并且自定义了__str__方法,使其在print函数中输出我们想要的格式。

5.3 __repr__方法

__repr__方法返回对象的“官方”字符串表示,可用于在交互式环境中直接输出对象。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

        # 自定义__repr__方法
    def __repr__(self):
        return f"Point({self.x}, {self.y})"

        # 创建Point实例
point = Point(1, 2)

# 在交互式环境中输出对象
point  # 输出: Point(1, 2)

在上述代码中,我们定义了一个Point类,并且自定义了__repr__方法,使其在交互式环境中直接输出对象的官方表示。

5.4 其他常用的魔术方法

除了上述介绍的魔术方法,Python还提供了许多其他魔术方法,如__add__、subeq、__lt__等,用于实现对象之间的运算和比较。详细内容可以参考Python官方文档。

结论

本文从属性和方法的基本概念入手,逐步深入介绍了Python中的属性与方法,包括实例属性、类属性、属性访问器和修改器、实例方法、类方法、静态方法、装饰器、继承、特殊方法等内容。希望通过本文的讲解,你对Python的面向对象编程有了更深刻的理解,并能在实际开发中灵活应用这些知识。

标签:__,高手,Python,self,实例,radius,玩转,方法,属性
From: https://www.cnblogs.com/shiqianlong/p/17591180.html

相关文章

  • # yyds干货盘点 # 使用Python统计下桌面某个文件夹下(含多层子文件夹)具体文件的数量(方
    大家好,我是皮皮。一、前言前几天在Python最强王者群【东哥】问了一个Python自动化办公的问题,一起来看看吧。这个是他自己在实际工作中遇到的需求,正好遇到了这个问题,想着用Python来实现下。二、实现过程上一篇文章中已经分享了一个方法,这一篇文章继续分享另外一个方法,由【巭孬嫑勥烎......
  • python数据分析师入门-学习笔记
    第一节数据分析整体介绍应用领域数据分析爬虫开发数据存储数据可视化数据分析内容1.语言基础python基础2.数据获取爬虫课程3.数据存储MySQL数据库4.数据处理NumpyPandas5.数据可视化Matplot......
  • python单例模式实现
    classSingleton(object):​  def__new__(cls,*args,**kwargs):    ifnothasattr(cls,'_instance'):      cls._instance=super(Singleton,cls).__new__(cls)    returncls._instance 注:__new__方法用于生成类实例,__new__应返回一个......
  • C++程序获取python脚本控制台输出的一种方法
    作者:朱金灿为什么大多数人学不会人工智能编程?>>>  最近要使用C++程序调用python脚本,调用方法是通过启动python进程来调用,其中遇到的一个问题是在C++程序中需要获取python脚本的控制台输出信息。经过摸索使用_popen函数实现了。下面用python脚本和C++调用示例程序来说明。py......
  • 【Python】使用 pyecharts 模块绘制动态时间线柱状图 ① ( 列表排序 | 使用 sorted 函
    文章目录一、列表排序1、使用sorted函数对容器进行排序2、使用list.sort函数对列表进行排序3、使用list.sort函数对列表进行排序-设置排序函数4、使用list.sort函数对列表进行排序-设置lambda匿名排序函数pyecharts画廊网站:https://gallery.pyecharts.org/#/......
  • 使用Python统计下桌面某个文件夹下(含多层子文件夹)具体文件的数量(方法三)
    大家好,我是皮皮。一、前言前几天在Python最强王者群【东哥】问了一个Python自动化办公的问题,一起来看看吧。这个是他自己在实际工作中遇到的需求,正好遇到了这个问题,想着用Python来实现下。二、实现过程上一篇文章中已经分享了一个方法,这一篇文章继续分享另外一个方法,由【巭孬......
  • 使用python基于boto3和tkintrer模块-编写一个AWS-EC2的管理器界面
    当我们管理自己AWS账号下的EC2资源时,一般都是登录到Console界面进行管理笔者自己的AWS经常是用于做一些实验时,才会去创建EC2,部署一些环境等,为了不用登录Console操作于是使用python,tkinter模块写了一个GUI的管理工具,先看一下整体界面如下:这个小工具,有创建EC2,查询EC2,删除指......
  • 从零玩转系列之微信支付实战PC端支付微信回调接口搭建
    一、前言halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端)在此之前已经更新了微信支付开篇、微信支付安全......
  • 如何在 Python 中计算列表中的唯一值?
    Python提供了各种方法来操作列表,这是最常用的数据结构之一。使用列表时的一项常见任务是计算其中唯一值的出现次数,这在数据分析、处理和筛选任务中通常是必需的。在本文中,我们将探讨四种不同的方法来计算Python列表中的唯一值。在本文中,我们将介绍如何使用集合模块中的集合、字......
  • 在 Python 中播放声音
    介绍我们首先检查playsound库,它为在Python中播放声音文件提供了一个简单直接的解决方案。凭借其最低的设置要求,开发人员可以使用单个函数调用将音频播放快速集成到他们的应用程序中。但是,对于更高级的音频功能,我们深入研究了两个流行的库:pygame和pyglet。Pygame是一个强大的多媒体......