相关疑难解决方法(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类中使用的'cls'变量是什么?

为什么cls有时self在Python类中使用而不是作为参数?

例如:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    @classmethod
    def from_fullname(cls, fullname):
        cls.firstname, cls.lastname = fullname.split(' ', 1)
Run Code Online (Sandbox Code Playgroud)

python terminology class object self

237
推荐指数
6
解决办法
17万
查看次数

python中的多个构造函数?

可能重复:
Python中有多个构造函数的干净,pythonic方法是什么?

是否不可能在Python中定义具有不同签名的多个构造函数?如果没有,绕过它的一般方法是什么?

例如,假设您想要定义一个类 City

我想能够说,someCity = City()或者someCity = City("Berlin"),第一个只提供默认名称值,第二个定义它.

python constructor

200
推荐指数
5
解决办法
21万
查看次数

Python中异常处理程序的成本

另一个问题中,接受的答案建议用try/except块替换Python代码中的(非常便宜的)if语句以提高性能.

抛开编码样式问题,并假设从未触发异常,与异常处理程序相比,具有异常处理程序(与性能相比)有多大差异,而不是具有比较为零的if语句?

python performance exception micro-optimization

84
推荐指数
5
解决办法
3万
查看次数

"请求原谅不许可" - 解释

我不是要求对这种哲学提出个人的"宗教"观点,而是要更具技术性.

我理解这句话是几个试金石中的一个,看你的代码是否是"pythonic".但对我来说,pythonic意味着干净,简单和直观,没有加载异常处理程序以进行错误的编码.

所以,实际的例子.我定义了一个类:

class foo(object):
    bar = None

    def __init__(self):
        # a million lines of code
        self.bar = "Spike is my favorite vampire."
        # a million more lines of code
Run Code Online (Sandbox Code Playgroud)

现在,来自程序背景,在另一个函数中,我想这样做:

if foo.bar:
    # do stuff
Run Code Online (Sandbox Code Playgroud)

如果我不耐烦并且没有做初始的foo = None,我会得到一个属性异常.所以,"请求宽恕不许可"表明我应该这样做吗?

try:
    if foo.bar:
        # do stuff
except:
    # this runs because my other code was sloppy?
Run Code Online (Sandbox Code Playgroud)

为什么我在try块中添加额外的逻辑会更好,这样我可以让我的类定义更加模糊?为什么不先定义所有内容,然后明确授予权限

(不要打扰我使用try/except块......我在任何地方都使用它们.我不认为用它们来捕捉我自己的错误是正确的,因为我不是一个彻底的程序员.)

或者......我是否完全误解了"请求原谅"的口头禅?

python

58
推荐指数
7
解决办法
2万
查看次数

多个构造函数:Pythonic方式?

我有一个容纳数据的容器类.创建容器时,有不同的方法来传递数据.

  1. 传递包含数据的文件
  2. 通过参数直接传递数据
  3. 不要传递数据; 只需创建一个空容器

在Java中,我将创建三个构造函数.以下是在Python中可能出现的情况:

class Container:

    def __init__(self):
        self.timestamp = 0
        self.data = []
        self.metadata = {}

    def __init__(self, file):
        f = file.open()
        self.timestamp = f.get_timestamp()
        self.data = f.get_data()
        self.metadata = f.get_metadata()

    def __init__(self, timestamp, data, metadata):
        self.timestamp = timestamp
        self.data = data
        self.metadata = metadata
Run Code Online (Sandbox Code Playgroud)

在Python中,我看到了三个明显的解决方案,但它们都不是很漂亮:

:使用关键字参数:

def __init__(self, **kwargs):
    if 'file' in kwargs:
        ...
    elif 'timestamp' in kwargs and 'data' in kwargs and 'metadata' in kwargs:
        ...
    else:
        ... create empty container
Run Code Online (Sandbox Code Playgroud)

B:使用默认参数:

def …
Run Code Online (Sandbox Code Playgroud)

python constructor initialization idiomatic initializer

57
推荐指数
3
解决办法
1万
查看次数

python中的多个构造函数,使用继承

我有一个AbstractDataHandle类,它的init方法和类Classifier.我想在Classifier中有两个构造函数,Java就像.一个继承自它的超类,一个全新的.

它会像(但我打算"保留"两个构造函数):

class AbstractDataHandle():
    def __init__(self, elements, attributes, labels):
        self._load(elements, attributes, labels)


class Classifier(AbstractDataHandle):
    def __init__(self, classifier="LinearSVC", proba=False):
        self._fit(classifier, proba)
Run Code Online (Sandbox Code Playgroud)

我可以在一个班级中拥有两个构造函数吗?如果是,我可以从超类继承构造函数,并添加一个新的构造函数吗?

先感谢您.

python oop inheritance constructor python-2.7

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

Python:**kargs而不是重载?

我有一个概念性的Python设计困境.

假设我有一个City类,它代表数据库中的一个城市.该City对象可通过两种方式进行初始化:

  1. 整数(实际上是数据库中现有城市的ID)
  2. 属性(列表name,country,population,...),这将在数据库中生成一个新的城市,并检索其ID.

这意味着City对象将始终具有ID - 初始化ID或从数据库派生的新创建ID.

经典的Java方法会使构造函数重载 - 一个构造函数将获得一个int参数,另一个构造函数将获得许多强类型参数.

我在Python中找不到一种优雅的方法:

  • 我可以创建一个单一的方法的基类get_city_id,并从中获得CityFromIDCityFromNewData从它,但是这是一个很大的努力来解决这个语言空白.
  • 使用类方法似乎很尴尬.
  • 使用带有长参数列表的构造函数也很尴尬:我将两个城市ID和备选方案放在一起,并在方法中验证只有特定子集具有值.

使用**kargs似乎非常不优雅,因为构造函数的签名没有明确说明所需的输入参数,文档字符串是不够的:

class City(object):
    def __init__(self, city_id=None, *args, **kargs):
        try:
            if city_id==None:
                self.city_id=city_id
            else:
                self.city_name=kargs['name']
        except:
            error="A city object must be instanciated with a city id or with"+\
            " full city details."
            raise NameError(error)
Run Code Online (Sandbox Code Playgroud)

是否有一个Pythonic,优雅的构造函数重载解决方案?

亚当

python design-patterns overloading

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

Python检查__init__参数

在过去的几个小时里,我一直在试图解决这个问题,我即将放弃.

你如何确保在python中只有匹配的特定条件才能创建对象?

例如,假设我想创建一个Hand对象,并且只有在初始化程序中有足够的Fingers时才初始化Hand?(请以此为例进行比喻)

说,

class Hand:
  def __init__(self, fingers):
    # make sure len(fingers)==5, and 
    #only thumb, index, middle, ring, pinky are allowed in fingers
    pass
Run Code Online (Sandbox Code Playgroud)

谢谢.

这些是我发现的最接近的问题,但一个是C++,另一个不回答我的问题.

检查构造函数参数

如何基于参数类型重载__init__方法?

python parameters class init

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

使用Python构造函数时出错

class fileDetails :

    def __init__(self,host,usr,pwd,database):
        self.host=host
        self.usr.usr
        self.pwd=pwd
        self.database=database

    def __init__(self,connection,sql,path):
        self.connection=mysql_connection()
        self.sql=sql
        self.path=path
Run Code Online (Sandbox Code Playgroud)

如果我使用构造函数,那么它会给出一个错误:

onnetction = fileDetails('localhost',"root","",'bulsorbit')
TypeError: __init__() takes exactly 4 arguments (5 given)
Run Code Online (Sandbox Code Playgroud)

python constructor

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

Python 类型提示:类定义本身的类型提示

class Session:
    

    @staticmethod
    def load_from_json(json_path:str) -> Session:
        pass
Run Code Online (Sandbox Code Playgroud)

上面抛出一个NameError: name 'Session' is not defined. 在其定义中使用自身作为类型提示是不可能的吗?

python class type-hinting

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