相关疑难解决方法(0)

Python方法可用于实例化/未实例化的类

我有一个类,它获取细节并使用信息填充类,如果它已经id使用details方法实例化了.如果它没有实例化,我希望它改为使用传入的参数details作为id并返回一个新的实例化对象.类似于以下内容:

f = Foo()
f.id = '123'
f.details()
Run Code Online (Sandbox Code Playgroud)

但也允许:

f = Foo.details(id='123')
Run Code Online (Sandbox Code Playgroud)

我可以使用相同的details方法来完成此任务吗?或者我是否需要创建两个单独的方法并制作一个@classmethod?如果我将一个声明为a @classmethod而另一个不声明,它们可以具有相同的名称吗?

python methods class-method

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

导入类看不到 Pytest 环境装置

我正在尝试设置 pytest,以便每当我运行测试(本地或在 github 操作中)时,环境变量都指向我的测试目录中的文件和位置,而不是根据用户设置的位置。

问题是,如果我ipdbtest_database函数中添加跟踪并打印,夹具更改是可见的os.getenv('DB_URL'),但断言将始终失败,因为DataBase对象始终具有原始的非模拟 url(在 中设置.bash_profile)。

数据库.py

import h5py
import os

class DataBase:

    route = os.environ.get('DB_URL')

    def __init__(self):
        self.connected = False

    def connect(self):
        if not connected:
            self.db = h5py.File(self.route, 'r')
            self.connected = True
Run Code Online (Sandbox Code Playgroud)

测试.py

import os
import pytest

@pytest.fixture(autouse=True)
def mock_test_env(monkeypatch):
    cwd = os.getcwd()
    monkeypatch.setenv('DB_URL', cwd + '/sample_db.hdf5')
Run Code Online (Sandbox Code Playgroud)

测试数据库.py

import pytest
from repo import DataBase

def test_database():
    db = DataBase()
    import ipdb; ipdb.set_trace()
    '''
    os.getenv('DB_URL') returns cwd + '/sample_db.hdf5' …
Run Code Online (Sandbox Code Playgroud)

python fixtures pytest

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

将函数转换为字段的装饰器是什么?

在某些时候,我遇到了一段这样的代码,用python编写:

class Foo(object):
    @Mystery
    def bar():
       return 5+3
print Foo().bar
Run Code Online (Sandbox Code Playgroud)

哪个打印8.然而我不记得装饰者被称为什么.我在想象事物,还是存在?如果确实存在它叫什么?

python python-decorators

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

使用属性设置器时出错"'str'对象不可调用"

我正在尝试使用如下的属性设置器.我在这里关注这个例子: @property装饰器是如何工作的?

class Contact:
    def __init__(self):
        self._funds = 0.00

    @property
    def funds(self):
        return self._funds

    @funds.setter
    def funds(self, value):
        self._funds = value
Run Code Online (Sandbox Code Playgroud)

吸气剂工作正常

>>> contact = Contact()
>>> contact.funds
0.0
Run Code Online (Sandbox Code Playgroud)

但是我错过了关于二传手的事情:

>>> contact.funds(1000.21)

Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/doctest.py", line 1315, in __run
    compileflags, 1) in test.globs
  File "<doctest __main__.Contact[2]>", line 1, in <module>
    contact.funds(1000.21)
TypeError: 'str' object is not callable
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?

python python-decorators

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

@property和property()之间的区别

两者之间有区别吗?

class Example(object):
    def __init__(self, prop):
        self._prop = prop

    def get_prop(self):
        return self._prop

    def set_prop(self, prop):
        self._prop = prop

    prop = property(get_prop, set_prop)
Run Code Online (Sandbox Code Playgroud)

class Example2(object):
    def __init__(self, prop):
        self._prop = prop

    @property
    def prop(self):
        return self._prop

    @prop.setter
    def prop(self, prop):
        self._prop = prop
Run Code Online (Sandbox Code Playgroud)

他们似乎做了同样的事情,这不符合python的目标,即只有一种明显的做事方式.有没有首选方式?如果是这样,为什么?

python properties decorator python-decorators

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

如何在models.py中的save方法中获取内联对象

我有类Invoice,其中(简化)具有以下属性:

class Invoice(models.Model)
    number = models.CharField(verbose_name="Number", max_length=16)
    issue_date = models.DateTimeField(verbose_name="Issue date", default=datetime.now)
    total = models.FloatField(verbose_name="Total", blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

然后,我有InvoiceLine类,它代表发票可以拥有的行/行:

class InvoiceLine(models.Model):
    invoice = models.ForeignKey(Invoice, verbose_name="Invoice")
    description = models.CharField(verbose_name="Description", max_length=64)
    line_total = models.FloatField(verbose_name="Line total")
Run Code Online (Sandbox Code Playgroud)

InvoiceLine是Invoice的内联,我想要实现的是,当在管理员中有人用发票线(一个或多个)保存发票时,计算发票总额.我试图通过覆盖方法保存来做到这一点:

class Invoice(models.Model)
    number = models.CharField(verbose_name="Number", max_length=16)
    issue_date = models.DateTimeField(verbose_name="Issue date", default=datetime.now)
    total = models.FloatField(verbose_name="Total", blank=True, null=True)

    def save(self, *args, **kwargs):
         invoice_lines = InvoiceLine.objects.filter(invoice=self.id)
         self.total = 0
         for line in invoice_lines:
             self.total=self.total+line.line_total
         super(Invoice, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

问题是,当我在InvoiceLine中添加元素时,第一次保存并调用functionsave时,内联(InvoiceLine)中的新元素尚未存储,所以当我这样做时InvoiceLine.objects.filter(invoice=self.id),它们不会被考虑在内.因此,这种方法的唯一方法是节省两次.我也尝试过:

def save(self, *args, **kwargs):
    super(Invoice, self).save(*args, **kwargs)
    invoice_lines = InvoiceLine.objects.filter(invoice=self.pk) …
Run Code Online (Sandbox Code Playgroud)

django django-models django-admin django-modeladmin django-admin-actions

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

使模型字段等于 Django 中两个字段的串联

我有两个模型,想为第二个类创建一个字段,该字段是外部字段和模型中的字段的串联。

我到目前为止的代码是:

class Drug(models.Model):
    drug_name = models.CharField("Drug Name", max_length=200)
    reference_title = models.CharField("Publication Title",max_length=1024)
    pub_date = models.DateField("Pubication Date",'date published')
    pubmed_link = models.CharField("PubMed Link", max_length=300)

class Risk(models.Model):
    drug_link = models.ForeignKey(Drug, on_delete=models.CASCADE)    
    dosage = models.IntegerField(default=0)
    independent_risk = models.DecimalField("Individual Risk", max_digits=4, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

我想向风险模型添加一个新字段,该字段由药物链接的选定值和剂量的输入值的串联自动填充。

python django django-models

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

添加两个__init__变量无法正确计算(应该是简单的解决,我是类的noob)

我正在制作一个简单的基于文本的游戏.我的完整代码是150行,所以我将包括我认为相关的内容.如果您需要更多,请告诉我.

问题是这一行:

print("You deal " + str(hero.damage) + " damage to the monster")
Run Code Online (Sandbox Code Playgroud)

根据需要仅返回5而不是5 +级别.

class Hero:

    def __init__(self):
        self.level = 0
        self.damage = 5 + self.level #This is the problem line. Self.level seems to be treated as equal to 0 even when it is higher than 0.
        self.experience = 0
    def level_up(self): #triggered on monster death
        xp_required = 15
        if self.experience >= xp_required:
            self.level += 1
hero = Hero()
Run Code Online (Sandbox Code Playgroud)

我知道hero.level_up()成功是因为:

print(hero.level)
Run Code Online (Sandbox Code Playgroud)

返回适当时正确更新的级别.

我猜是:

self.damage 只计算一次,然后即使在其组成部分发生变化后也存储该值.

要么:

在其中调用 …

python python-3.6

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

创建矩形类

我真的不太了解课程,任何帮助都会很棒。

\n\n

矩形类应具有以下私有数据属性:

\n\n
    \n
  • __length
  • \n
  • __width
  • \n
\n\n

Rectangle 类应该有一个 __init__方法来创建这些属性并将它们初始化为 1。它还应该有以下方法:

\n\n
    \n
  • set_length__length\xe2\x80\x93 该方法为字段赋值

  • \n
  • set_width__width\xe2\x80\x93 该方法为字段赋值

  • \n
  • get_length__length\xe2\x80\x93 该方法返回字段的值

  • \n
  • get_width__width\xe2\x80\x93 该方法返回字段的值

  • \n
  • get_area\xe2\x80\x93 该方法返回 Rectangle 的面积

  • \n
  • __str__\xe2\x80\x93 该方法返回对象\xe2\x80\x99s 状态

  • \n
\n\n

\n\n

class Rectangle:\n\n  def __init__(self):\n      self.set_length = 1\n      self.set_width = 1\n      self.get_length = 1\n      self.get_width = 1\n      self.get_area = 1\n\ndef get_area(self):\n    self.get_area = self.get_width * self.get_length\n    return self.get_area\n\n\ndef main():\n\n  my_rect = …
Run Code Online (Sandbox Code Playgroud)

python class

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

numba jitclass - 属性 ax 是 ax 返回 False

尝试检查两个 jitclass 实例属性的身份时,我发现与普通的 python 类相比,这种行为很奇怪。Numba jitclass 在其自己的实例属性身份检查中返回 False,其中普通 Python 类按预期工作。

import numba

class MyClass(object):
    def __init__(self, x):
        self.x = x

spec = [('x', numba.double)]
@numba.jitclass(spec)
class MyJitClass(object):
    def __init__(self, x):
        self.x = x

a = MyClass(1)
b = MyJitClass(1)
Run Code Online (Sandbox Code Playgroud)

现在检查身份:

>>> a.x is a.x
True
>>> b.x is b.x
False
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?我应该如何检查两个 jitclass 属性是否引用了同一个对象?

python jit identity numba

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

打印一个不起作用的房产的吸气剂?

我是python的新手,目前正在尝试学习属性.

class Car(object):
    def set_speed(self, speed):
        self._speed = speed
        print("set speed to {}".format(self.speed))


    def get_speed(self):
        return self._speed
        print("the speed is {}".format(self.speed))


    speed = property(fget = get_speed, fset=set_speed)

car1 = Car()
car1.speed = 170
x = car1.speed
Run Code Online (Sandbox Code Playgroud)

我得到的输出是 set speed to 170

这一切都很好,从那以后car1.speed就没有任何意外了.但是,为什么从来没有"The speed is 170"印刷线呢? car1.speed是以同样的方式被召唤?有什么我不明白的吗?

python properties decorator python-decorators

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

属性的getter方法是否返回浅表副本

我知道python中的函数总是返回变量的引用。我很好奇属性的getter方法是否返回深拷贝,或者getter方法仅是形式并返回引用。

python

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