Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python类方法是否可以将在init(self)中更新的同一类变量作为参数?_Python - Fatal编程技术网

python类方法是否可以将在init(self)中更新的同一类变量作为参数?

python类方法是否可以将在init(self)中更新的同一类变量作为参数?,python,Python,我有两个python类 class A: """ This is a class retaining some constants """ C=1 class B: VAR = None def __init__(self): b.VAR = A def f(self, v=VAR ): print(v.C) clb = B() clb .f() Attri

我有两个python类

class A:
"""
This is a class retaining some constants
"""
    C=1

class B:
     VAR = None
     def __init__(self):
         b.VAR = A
     def f(self, v=VAR ):
         print(v.C)

clb = B()
clb .f()

AttributeError: 'NoneType' object has no attribute 'C'
所以我要做的是用类A的引用填充B::init()中的B::VAR类变量,然后在B::f()中使用默认参数v(保留VAR)访问A::C。 我打算使用v作为B::f()中代码的默认值,如果需要在调用函数时对其进行更改。 我的设想可能吗

谢谢,

是的,这是可能的:

A类:
"""
这是一个保留一些常量的类
"""
C=1
B类:
VAR=无
定义初始化(自):
self.VAR=A
def f(自身,v=无):
如果v为无:
v=自我变量
印刷品(v.C)
clb=B()
clb.f()
问题是默认参数
v=VAR
是对
B.VAR
的旧引用,它是
None
,而不是对象
clb.VAR
的更新值

此图显示,旧版本的
f()
有一个指向None的默认值v,因为这是在定义类B时,在创建clb:B对象之前,在方法定义时计算得出的,其中VAR是类属性。 我的建议是在运行时通过
self
使用对象的变量设置
v
,该变量在
\uuuuu init\uuuuu
中更改为
A

class A:
    C = 1


class B:
    VAR = None

    def __init__(self):
        B.VAR = A

    @classmethod
    def f(cls):
        print(cls.VAR.C)


clb = B()
clb.f()

这是另一种方法。然而,我想知道你到底想做什么,因为这看起来真的很奇怪

请浏览和,看看这个网站是如何工作的,并帮助你改进当前和未来的问题,这可以帮助你获得更好的答案。首先,你需要发布一个明确的问题:在这篇文章中,您似乎使用了另一种语言的符号,这在Python中有不同的含义。其次,您似乎不清楚作用域规则——我认为您试图将A.C当作一个全局变量,而不是一个类属性来使用。第三,您似乎还没有掌握Python类的基础知识——类和实例方法中所需的语法。请重复课堂教程并澄清您的问题。目前,你已经超越了你目前的技能,无法在这里形成一个坚实的问题。对我来说,问题很清楚,这是关于python如何创建默认参数,这让很多初学者无法理解会发生什么。当然,通过了解问题,问题可能会更清楚,但对我来说,这是一个“Ok tier”质量。这是否回答了你的问题?这也应该有效,但您失去了对象之间的区别:所有对象的f()将打印相同的输出。但如果这是预期的行为,这就更简单了。谢谢Simon。在我的现实生活场景中,类A是引用网站URI的常量的“容器”。我有很多类,比如一些网站的类。我通过工厂函数选择需要常数的站点。此函数返回对这些“容器”类之一的引用。我使用B作为其他站点的基类,目的是让每个站点单独处理,因为它们提供完全不同的资源。因此,在现实生活中,我没有使用B.VAR=A,而是使用B.CONSTANTS=get_CONSTANTS(“siteN”)作为B::f(),大多数时候我使用一个URI,有时我需要另一个URI。