相关疑难解决方法(0)

什么是在Python中拥有多个构造函数的干净,pythonic方式?

我无法找到明确的答案.AFAIK,你不能__init__在Python类中拥有多个函数.那么我该如何解决这个问题呢?

假设我有一个Cheese使用该number_of_holes属性调用的类.我怎样才能有两种创建奶酪对象的方法......

  1. 一个像这样的洞: parmesan = Cheese(num_holes = 15)
  2. 并且不带参数并且只是随机化number_of_holes属性:gouda = Cheese()

我只想到一种方法来做到这一点,但这似乎有点笨重:

class Cheese():
    def __init__(self, num_holes = 0):
        if (num_holes == 0):
            # randomize number_of_holes
        else:
            number_of_holes = num_holes
Run Code Online (Sandbox Code Playgroud)

你说什么?还有另外一种方法吗?

python constructor

660
推荐指数
9
解决办法
26万
查看次数

Python函数重载

我知道Python不支持方法重载,但我遇到了一个问题,我似乎无法以一种漂亮的Pythonic方式解决这个问题.

我正在制作一个角色需要射击各种子弹的游戏,但是如何编写不同的功能来制作这些子弹呢?例如,假设我有一个函数可以创建一个以给定速度从A点到B点行进的子弹.我会写一个这样的函数:

    def add_bullet(sprite, start, headto, speed):
        ... Code ...
Run Code Online (Sandbox Code Playgroud)

但我想写其他功能来创建子弹,如:

    def add_bullet(sprite, start, direction, speed):
    def add_bullet(sprite, start, headto, spead, acceleration):
    def add_bullet(sprite, script): # For bullets that are controlled by a script
    def add_bullet(sprite, curve, speed): # for bullets with curved paths
    ... And so on ...
Run Code Online (Sandbox Code Playgroud)

等等有很多变化.有没有更好的方法来做到这一点,而不使用这么多的关键字参数导致它快速变得有点难看.重命名每个功能,因为你要么是非常糟糕过add_bullet1,add_bullet2或add_bullet_with_really_long_name.

要解决一些问题:

  1. 不,我无法创建Bullet类层次结构,因为它太慢了.管理项目符号的实际代码在C中,我的函数是围绕C API的包装器.

  2. 我知道关键字参数,但检查各种参数组合变得烦人,但默认参数有助于分配 acceleration=0

python overloading

175
推荐指数
14
解决办法
20万
查看次数

如何在Python中使用方法重载?

我试图在Python中实现方法重载:

class A:
    def stackoverflow(self):    
        print 'first method'
    def stackoverflow(self, i):
        print 'second method', i

ob=A()
ob.stackoverflow(2)
Run Code Online (Sandbox Code Playgroud)

但输出是second method 2; 类似的:

class A:
    def stackoverflow(self):    
        print 'first method'
    def stackoverflow(self, i):
        print 'second method', i

ob=A()
ob.stackoverflow()
Run Code Online (Sandbox Code Playgroud)

给

Traceback (most recent call last):
  File "my.py", line 9, in <module>
    ob.stackoverflow()
TypeError: stackoverflow() takes exactly 2 arguments (1 given)
Run Code Online (Sandbox Code Playgroud)

我该如何工作?

python overloading class

147
推荐指数
13
解决办法
18万
查看次数

python中重载的函数?

是否有可能在Python中重载函数?在C#中,我会做类似的事情

void myfunction (int first, string second)
{
//some code
}
void myfunction (int first, string second , float third)
{
//some different code
}
Run Code Online (Sandbox Code Playgroud)

然后当我调用函数时,它会根据参数的数量区分两者.是否有可能在Python中做类似的事情?

python arguments overloading function

83
推荐指数
3
解决办法
9万
查看次数

Python中的函数重载:缺失

如上所述:

http://web.archive.org/web/20090624083829/http://mail.python.org/pipermail/python-list/2003-May/206149.html

Python中没有函数重载.

据我所知,这也是一个很大的障碍,因为它也是一种OO语言.最初我发现无法区分参数类型很困难,但Python的动态特性使其变得容易(例如,列表,元组,字符串非常相似).

然而,计算传递的参数数量然后完成工作就像是一种矫枉过正.

python overloading missing-features

61
推荐指数
5
解决办法
10万
查看次数

Python元类:为什么在类定义期间没有为__setattr__调用属性集?

我有以下python代码:

class FooMeta(type):
    def __setattr__(self, name, value):
        print name, value
        return super(FooMeta, self).__setattr__(name, value)

class Foo(object):
    __metaclass__ = FooMeta
    FOO = 123
    def a(self):
        pass
Run Code Online (Sandbox Code Playgroud)

我本来期望__setattr__的元类被称为两个的FOO和a.但是,它根本没有被调用.当我给你的东西Foo.whatever类已经被定义之后,该方法被调用.

这种行为的原因是什么,有没有办法拦截在创建类时发生的任务?因为我想检查一个方法是否被重新定义,因此使用attrsin __new__将不起作用.

python metaclass

12
推荐指数
2
解决办法
2719
查看次数

classmethod和instancemethod的名称相同吗?

我想做这样的事情:

class X:

    @classmethod
    def id(cls):
        return cls.__name__

    def id(self):
        return self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

现在要求id()它的类或它的实例:

>>> X.id()
'X'
>>> X().id()
'X'
Run Code Online (Sandbox Code Playgroud)

显然这个确切的代码不起作用,但有没有类似的方法使它工作?或者任何其他解决方法来获得这样的行为没有太多"hacky"的东西?

python methods class-method python-3.x

10
推荐指数
4
解决办法
4764
查看次数

如何按照Python类中声明的顺序获取属性?

如PEP435中所述,enum可以通过以下方式定义:

class Color(Enum):
    red = 1
    green = 2
    blue = 3
Run Code Online (Sandbox Code Playgroud)

并将所得enum members的Color可实现高精细的顺序重复:Color.red, Color.green, Color.blue.

这让我想起了Form在Django中,哪些字段可他们在声明的顺序渲染Form子类.他们通过维护字段计数器来实现这一点,每次实例化新字段时计数器值都会增加.

但是在定义中Color,我们没有像a这样的东西,我们FormField怎么能实现呢?

python metaclass

5
推荐指数
1
解决办法
1187
查看次数

定义具有相同名称但返回类型不同的两个方法是否合法?

我写了一段代码来确定一个典型的回文字符串.我通过返回字符串的reverse()方法的定义来做到这一点.我也渴望拥有相同的方法,但是在虚空形式中,因为未来的某些需求.当我将后者添加到代码中时,有效输出将变为无效.所以,问题是定义两个具有相同名称但返回类型不同的方法是否合法?如果没有,请让我知道如何使用void-type方法编写此代码.

class detector(object):
    def __init__(self,string):
        self.string = string

    forbidden = (' ','!','?','.','-','_','&','%',"#",",")

    def eliminator(self):
        for item in self.forbidden:
            if item in self.string:
                self.string = self.string.replace(item,"")

    def reverse(self):
        return self.string[::-1]            

    #def reverse(self):
    #    self.string = self.string[::-1]    I am prone to add this method

    def check(self):
        reversed = self.reverse()
        if self.string == reversed:
            print("Yes")
        else:
            print("No")

det = detector("rise to vote, sir!")
det.eliminator()
det.check()
Run Code Online (Sandbox Code Playgroud)

当我添加注释行时,有效的"是"变为"否"!

python

1
推荐指数
2
解决办法
4580
查看次数

Python:两个具有相同名称的函数

我只是在玩python,发现有些奇怪。

我有以下功能:

def myfun():    #f1
    return 1 
def myfun():    #f2
    return 0 

print (myfun())
Run Code Online (Sandbox Code Playgroud)

我改变了值f1和f2,但它仍然似乎总是在打印的返回值f2。是否有特定原因?

python

1
推荐指数
1
解决办法
3214
查看次数