python 类中的函数

Posted

技术标签:

【中文标题】python 类中的函数【英文标题】:function within a class in python 【发布时间】:2022-01-23 22:07:26 【问题描述】:

我对 Python 中的 OOP 很陌生。

为了避免类方法中的重复代码,我想在类中引入一个函数,然后从方法中调用该函数。从逻辑的角度来看,这些函数应该属于类,而不应该是全局函数。

我附上了一个小(废话)示例。但是该示例仅在函数“SillyName”作为全局函数放置在类之外时运行。但它应该是课堂的一部分。我不知道该怎么做,因为当我把它放在里面时,我收到一个错误(NameError: name 'SillyName' is not defined)。你能帮忙吗?

import random

class SillyPerson:

    def __init__(self, FirstName, LastName):
        self.FirstName  = SillyName(FirstName)
        self.LastName   = SillyName(LastName)

    def __str__(self):
        return (f"Name is self.FirstName self.LastName")


def SillyName (name):
    """ returns a silly name if a None-Monthy-Python-Name is passed"""
    if name in "John Cleese Eric Idle Michael Palin Terry":
        return name
    else:
        return ''.join(random.sample(name,len(name)))




person1 = SillyPerson ("Michael","Moore")
person2 = SillyPerson ("Silvester","Stalone")
print (person1)
print (person2)

【问题讨论】:

考虑私有方法(带有_前缀) 我不明白你不明白什么......你已经在你的类中定义了两个函数,那么第三个函数不起作用是什么?跨度> ",因为当我把它放在里面时,我得到了一个错误。" 什么错误? 请不要只说“我遇到错误”。告诉我们*您到底做了什么以及遇到了什么错误,包括堆栈跟踪的完整错误消息”。 Meaning of classmethod and staticmethod for beginner?的可能重复 【参考方案1】:

感谢您的快速回答!

当我需要一个类中的函数而不使用类的实例时,有了这些信息,我会这样做

    在类中放一个函数 从具有前导 self 的类方法中调用函数 将函数定义为静态方法(没有 self 作为参数),因为函数中没有使用实例

也感谢您在文章的其中一个 cmets 中提供链接,其中解释了背景:

Meaning of @classmethod and @staticmethod for beginner?

import random

class SillyPerson:

    def __init__(self, FirstName, LastName):
        self.FirstName  = self.SillyName(FirstName)
        self.LastName   = self.SillyName(LastName)

    def __str__(self):
        return (f"Name is self.FirstName self.LastName")


    @staticmethod
    def SillyName (name):
        """ return sillyname if a not Monthy Python name is passed"""
        if name in "John Cleese Eric Idle Michael Palin Terry":
            return name
        else:
            return ''.join(random.sample(name,len(name)))




person1 = SillyPerson ("Michael","Moore")
person2 = SillyPerson ("Silvester","Stalone")
print (person1)
print (person2)

【讨论】:

【参考方案2】:
import random

class SillyPerson:

def __init__(self, FirstName, LastName):
    self.FirstName  = self.SillyName(FirstName)
    self.LastName   = self.SillyName(LastName)

def __str__(self):
    return (f"Name is self.FirstName self.LastName")


def SillyName (self,name):
    """ returns a silly name if a None-Monthy-Python-Name is passed"""
    if name in "John Cleese Eric Idle Michael Palin Terry":
        return name
    else:
        return ''.join(random.sample(name,len(name)))




person1 = SillyPerson ("Michael","Moore")
person2 = SillyPerson ("Silvester","Stalone")
print (person1)
print (person2)

【讨论】:

只使用@staticmethod,参数self无论如何都不会使用,还要修复缩进 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案3】:

类中的方法在编写时需要以 self 作为参数,在调用时需要以 self. 作为参数。

import random

class SillyPerson:
    def __init__(self, FirstName, LastName):
        self.FirstName  = self.SillyName(FirstName)
        self.LastName   = self.SillyName(LastName)

    def __str__(self):
        return (f"Name is self.FirstName self.LastName")


    def SillyName (self, name):
        """ returns a silly name if a None-Monthy-Python-Name is passed"""
        if name in "John Cleese Eric Idle Michael Palin Terry":
            return name
        else:
            return ''.join(random.sample(name,len(name)))




person1 = SillyPerson ("Michael","Moore")
person2 = SillyPerson ("Silvester","Stalone")
print (person1)
print (person2)

【讨论】:

好吧,现在不需要它是一个实例方法(它可以是一个@staticmethod,并且可以删除参数self,因为即使它是一个方法也没有使用它)

以上是关于python 类中的函数的主要内容,如果未能解决你的问题,请参考以下文章

Python 类中的变量范围

Python 类中的变量范围

Python:替换模块类中的函数

类中的 Python 主函数

python 类中的某个函数作为装饰器

python 类中的运算符和函数重载