【问题标题】:Python Nested Function with Variables vs. Class?具有变量与类的 Python 嵌套函数?
【发布时间】:2021-09-02 20:16:42
【问题描述】:

带有变量的 Python 嵌套函数和带有属性和方法的类有什么区别? 我上网查了一下,问了一个程​​序员,但仍然没有弄清楚一个类与包含变量和其他函数的函数有何不同。

示例:

class Add:
    def __init__(self):
        self.a = 5
        self.b = 7
    
    def inside_method(self):
        return (self.a + self.b)

add1 = Add()
print('sum is:', add1.inside_method())

带变量的嵌套函数

def func():
    a = 5
    b = 7
    def nested_func():
        return (a + b)
    return nested_func()
    
print('sum is:', func())

【问题讨论】:

  • 您看不到任何区别,因为您的示例首先没有多大意义。在其__init__ 实现中没有参数的类(例如您的)不是很有用。
  • 在您的示例中,该类只是增加了不必要的麻烦,而没有增加任何价值。但一般来说,类可以提供多种方法,并为可能无法在一个函数中概括的复杂操作或概念公开一个方便的接口。
  • 这些都是相似的,但对同一件事的不同方法——封装状态。一个类具有语言内置的各种功能,例如继承,您将不会对某些变量和高阶函数使用闭包。当然,您可以以某种方式重新创建它,但是,您将只是重新实现已经是该语言功能的类
  • @juanpa.arrivillaga 谢谢。那么,类还有很多嵌套函数没有的其他特性吗?
  • 如何从func外部访问嵌套函数?

标签: python class nested-function


【解决方案1】:

你问题上的cmets已经是一个很好的答案了。

Python 方法只是一个以self 作为第一个参数的函数,它是定义该方法的类的实例(继承类)。

确实,对于您非常简单的示例,使用类几乎没有用。但是您可能熟悉 str 类的 Python 字符串:

>>> type("hello")

一个字符串有many methodscapitalizecasefoldcentercountencodeendswith,...

这很方便,因为我不需要每次为我要调用的每个方法都创建相同的字符串,我可以重复使用相同的实例:

>>> s = "hello"
>>> s.capitalize()
"Hello"
>>> s.replace("h", "G")
'Gello'
>>> s.count("l")
2

更强大的是使用类实例来存储状态。 Python 字符串是不可变的,但列表不是。

>>> temperatures = [14, 15, 10, 33]
>>> temperatures[1]
15
>>> temperatures[1] = 0
>>> temperatures
[14, 0, 10, 33]
>>> temperatures.sort()
>>> [0, 10, 14, 33]

在 Python 中实现的面向对象主要是关于将状态数据与对其进行操作的函数(命名方法)耦合。它旨在简化这些通常有用的结构。

希望它澄清!

【讨论】:

  • 谢谢,所以主要区别在于可以在类中使用点表示法,但只使用函数不允许吗?以及创建类的副本(实例)并在这些实例中存储/更改变量和函数(方法)的能力?
  • 主要区别在于代码的结构。你可以只使用函数,不能使用对象/类/方法,并且可以使用它,它实际上被称为functionnal programming。但是还有其他范例,例如 object-oriented,它们提供了不同的方法和权衡。这里的“点符号”只是一个细节,但它确实是过程和面向对象的区别。这是一个关于这个主题的问题:stackoverflow.com/q/60116769/11384184
  • 至于你的第二个问题,“面向对象”是一个笼统的术语,所以有很多不同的东西叫做这种方式。但是在 Python 的上下文中,是的,OO 的基础是用方法定义类,实例化它们并用它们的状态做事。还有继承、多态、封装、接口、抽象……这些是 OO 概念,您可以在 Python 中使用它们以某种方式“建模”您的“域”。如果您还有更多问题,最好创建一个新的 StackOverflow 问题并将我的答案标记为已接受:)
【解决方案2】:

在我看来,function 是“动作”的抽象,class 是“事物”的抽象。从这个角度来看,函数中的成员(局部变量、闭包变量和嵌套函数)是为了协助顺利完成一个“动作”。另一方面,类的成员(其中的变量和方法)作为“对象”一起工作。当您尝试使用它们时,差异会更加明显。

就像Lenormju 说的,它们是不同的范式。选择哪一个来满足你的需求的目的就是你想如何抽象现实世界。在您的示例中,使用嵌套函数进行加法计算更合适。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-17
    • 2018-07-16
    • 2015-01-28
    • 1970-01-01
    • 2013-03-31
    • 2011-07-10
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多