首页 > 编程语言 >Python 类的高级特性和使用方法

Python 类的高级特性和使用方法

时间:2023-09-01 15:33:05浏览次数:32  
标签:__ name Python self 高级 特性 print class def

Python 是一种面向对象的编程语言,类是 Python 中最基本的面向对象概念之一。在创建类时,我们可以通过一些高级特性和使用方法来扩展类的功能和行为。本文将介绍一些常见的 Python 类高级特性,并提供具体的实例来说明其用法。

继承

继承是 Python 面向对象编程中一个非常重要的概念。它允许我们从一个或多个基类(父类)中继承属性和方法  (此处不同于java,是可多继承),并添加自己的特定行为

下面是一个简单的继承示例:

class Animal:
    def speak(self):
        print("Animal is speaking...")
    
class Cat(Animal):
    def speak(self):
        print("Meow!")

class Dog(Animal):
    def speak(self):
        print("Woof!")

c = Cat()
c.speak()   # 输出:Meow!

d = Dog()
d.speak()   # 输出:Woof!

  

在上述代码中,我们定义了一个 Animal 基类和两个派生类 CatDog,这两个派生类都从 Animal 类中继承了 speak 方法,并对它们自己的方式进行了重写。当我们实例化一个 CatDog 对象并调用 speak 方法时,程序会根据对象类型调用相应的方法。这种现象称为多态。

多态

多态是 Python 中另一个非常重要的面向对象特性。它允许不同的对象对相同的消息做出响应,即使它们的类型不同。

下面是一个简单的多态示例:

class Shape:
    def area(self):
        pass
    
class Rectangle(Shape):
    def __init__(self, width, length):
        self.width = width
        self.length = length
        
    def area(self):
        return self.width * self.length
    
class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
        
    def area(self):
        import math
        return math.pi * self.radius ** 2

shapes = [Rectangle(4, 5), Circle(7)]
for shape in shapes:
    print(shape.area())

  

在上述代码中,我们定义了一个 Shape 基类和两个派生类 RectangleCircle,它们都实现了 area 方法。然后我们创建一个包含两个不同形状的列表,并遍历该列表并分别调用它们的 area 方法。由于不同的形状类型有不同的计算方法,因此调用相同的方法名 area 会得到不同的结果。这正是多态的体现。

类装饰器

类装饰器是修饰类的函数或类,可以用于修改类的行为或元数据。其中比较常见的类装饰器是 @classmethod@staticmethod

下面是一个类装饰器示例:

class MyClass:
    count = 0
    
    def __init__(self):
        MyClass.count += 1
    
    @classmethod
    def get_count(cls):
        return cls.count
    
    @staticmethod
    def hello():
        print("Hello, world!")
        
m1 = MyClass()
m2 = MyClass()
print(MyClass.get_count())  # 输出:2
MyClass.hello()             # 输出:Hello, world!

  

,它会返回当前类的实例数量,而调用 hello 方法则会输出一条问候消息。需要注意的是,因为 get_count 方法使用了装饰器 @classmethod,所以它的第一个参数是 cls,而不是 self

属性装饰器

属性装饰器是修饰类属性的函数,可以用于对属性的读取和写入进行控制,包括限制访问权限、动态计算属性值等。

下面是一个属性装饰器示例:

class Person:
    def __init__(self, name):
        self._name = name
    
    @property
    def name(self):
        print("Getting name...")
        return self._name
    
    @name.setter
    def name(self, value):
        print("Setting name...")
        self._name = value

p = Person("Alice")
print(p.name)   # 输出:Getting name... Alice
p.name = "Bob"  # 输出:Setting name...
print(p.name)   # 输出:Getting name... Bob

  

上下文管理器

上下文管理器是支持 with 语句的对象,可以用于控制代码块的上下文行为。在 Python 中,实现上下文管理器需要定义两个方法 __enter____exit__

下面是一个上下文管理器示例:

class OpenFile:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode
        
    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file
    
    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()

with OpenFile("test.txt", "w") as f:
    f.write("Hello, world!")

  

在上述代码中,我们定义了一个 OpenFile 类,它接受两个参数 filenamemode,并在 __enter__ 方法中打开文件,并在 __exit__ 方法中关闭文件。

然后我们使用 with 语句创建一个上下文管理器,并在代码块中使用文件对象 f 写入一些数据。由于使用了上下文管理器,在代码块结束时,程序会自动关闭文件,而不需要手动调用 close 方法。

 

元类

元类是创建类的类,可以用于控制类的创建过程,包括修改类的属性和方法、验证类的结构和行为等。在 Python 中,可以通过编写元类来实现自定义类的创建方式

下面是一个元类示例:

class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        print("Creating class...")
        if "x" not in attrs:
            attrs["x"] = 100
        return super().__new__(cls, name, bases, attrs)

class MyClass(metaclass=MyMeta):
    y = 200

print(MyClass.x)  # 输出:100

  

在上述代码中,我们定义了一个元类 MyMeta,它重写了 __new__ 方法,并在其中添加了一些自定义逻辑。然后我们定义了一个类 MyClass,并将其元类指定为 MyMeta。当我们实例化 MyClass 对象并调用 x 属性时,程序会自动执行元类的 __new__ 方法,并输出一条信息,同时在类定义中添加了一个新的属性 x 并赋初始值 100

结论

Python 类具有许多高级特性和使用方法,这些特性使得 Python 编程更加灵活、强大、易读易

 

标签:__,name,Python,self,高级,特性,print,class,def
From: https://www.cnblogs.com/shoshana-kong/p/17671997.html

相关文章

  • 分享一个Python字符串替换的基础题目(上篇)
    大家好,我是皮皮。一、前言前几天在Python最强王者群【莫生气】问了一个Python字符串基础处理的问题,一起来看看吧。二、实现过程这里大家对于strip()函数理解不深刻的话,很容易犯迷糊,这里答案就是输出一个字符c。因为strip会把参数ab分开来一个个的删除,如果是strs.strip('abc......
  • 【Python】- 装饰器
    装饰器通过一个简单的装饰器示例来展示装饰器的特性及本质:python_decorator.pydefmy_decorator(func):defwrapper(*args,**kwargs):print("Beforefunctioniscalled")result=func(*args,**kwargs)#调用原始函数print(f'funcresult......
  • 一个python 类 通常有哪几部分组成
    一个Python类通常包含以下几个部分:类的声明:使用class关键字来声明类,后跟类名称和一个冒号。初始化方法__init__:定义一个特殊的方法__init__来初始化对象,并设置初始属性值。这个方法在创建对象时自动调用。属性:定义类的属性(变量),可以是类属性或实例属性,以及它们的默......
  • Lnton羚通视频分析算法平台OpenCV-Python教程 图像变换(频域变换)
     频域变换是一种将信号从时间域表示转换为频率域表示的方法。它可以帮助我们理解信号的频率成分以及进行信号处理和分析。常见的频域变换方法包括傅里叶变换(FourierTransform)和离散傅里叶变换(DiscreteFourierTransform,DFT)。以下是它们的简要介绍:傅里叶变换(FourierTransform):......
  • Python下载_Python免费版下载「编程工具」中文版介绍
    Python具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。Python的名字来源于一个喜剧,也许最初设计Python这种语言的人并没有想到今天它会在工业和科研上获得如此广泛的使用。著名的自由软件作者EricRaymond在他的文章《如何成为一名黑客》中,将Python列为黑客应当学习的......
  • Python-3.10.5学习笔记
     Linux系统-部署-运维系列导航pip源初始化pipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simplepipconfigsetinstall.trusted-hostpypi.tuna.tsinghua.edu.cn VSCode插件安装语法检查flake8代码格式化yapf文件及文件夹图标vscode-icon......
  • Python-嵌套数组获取对应的值
    二维数组示例:er_array=[['霹雳火','急先锋','超音速']]forinner_arrayiner_array:#嵌套二维数组,使用两个嵌套的for循环遍历数组并获取值forvalueininner_array:print(value) 方法一:使用enumerate函数,遍历获取元素的索引er_array=[['霹雳......
  • Python 深度学习目标检测评价指标
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • python字典的应用一(增删改查)
    #一.有如下字典内容用程序解答下面的题目dic={'python':95,'java':99,'c':100}#1.字典的长度是多少print(len(dic))#2.请修改'java'这个key对应的value值为98dic["java"]=98print(dic)#3.删除c这个keydeldic["c"]print(di......
  • Python中while的and和or
    whileAandB:同时满足A和B条件whileAorB:满足A或B任意一条以1768.交替合并字符串官方答案为启发,以前没意识到while还可以用and和or。其实无论用什么,只要看最后的结果是True或FalseclassSolution:defmergeAlternately(self,word1:str,word2:str)->str:......