Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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类变量_Python_Oop_Static Methods_Static Variables - Fatal编程技术网

静态方法中的python类变量

静态方法中的python类变量,python,oop,static-methods,static-variables,Python,Oop,Static Methods,Static Variables,[更新]:完整代码 我总是对Pyton的静态方法感到困惑 但根据(最后一个答案),它应该有效 获取错误: AttributeError:MyConnection类没有属性“myuser” 如果属性将是静态的,则不要在初始化器方法中初始化它们,而是在类级别(而不是方法级别)外部声明它们 但是为什么要在初始化器中初始化类属性呢?您创建的每个实例都将覆盖它们的值 我认为您混淆了实例属性和类属性的用途。为什么不尝试只使用实例属性?综合考虑,拥有静态数据不是一个好主意。例如: class MyConnec

[更新]:完整代码

我总是对Pyton的静态方法感到困惑 但根据(最后一个答案),它应该有效

获取错误:

AttributeError:MyConnection类没有属性“myuser”


如果属性将是静态的,则不要在初始化器方法中初始化它们,而是在类级别(而不是方法级别)外部声明它们

但是为什么要在初始化器中初始化类属性呢?您创建的每个实例都将覆盖它们的值

我认为您混淆了实例属性和类属性的用途。为什么不尝试只使用实例属性?综合考虑,拥有静态数据不是一个好主意。例如:

class MyConnection:
    def __init__(self, hostname, port, user, password):
        self.myhostname = hostname
        self.myport = port
        self.myuser = user
        self.mypassword = password
    @staticmethod
    def connect():
        my_session = MyConnection()
        print my_session.myuser # just an example

如果属性将是静态的,则不要在初始化器方法中初始化它们,而是在类级别(而不是方法级别)外部声明它们

但是为什么要在初始化器中初始化类属性呢?您创建的每个实例都将覆盖它们的值

我认为您混淆了实例属性和类属性的用途。为什么不尝试只使用实例属性?综合考虑,拥有静态数据不是一个好主意。例如:

class MyConnection:
    def __init__(self, hostname, port, user, password):
        self.myhostname = hostname
        self.myport = port
        self.myuser = user
        self.mypassword = password
    @staticmethod
    def connect():
        my_session = MyConnection()
        print my_session.myuser # just an example

您必须在类范围(静态属性)或实例范围(在
\uuuu init\uuu
中)中定义属性

因此,在类范围内,它看起来像:

class Cls(object):
    class_scope_attribute = 1

    @staticmethod
    def method1():
        print Cls.class_scope_attribute

    @classmethod
    def metdho2(cls):
        print cls.class_scope_attribute

    def method3(self):
        print Cls.class_scope_attribute
        print self.__class__.class_scope_attribute
在实例范围中:

class Cls2(object):
    def __init__(self):
        self.instance_scope_attribute

    @staticmethod
    def method1():
        # cannot access the instance_scope_attribute
        pass

    @classmethod
    def method2(cls):
        # cannot access the instance_scope_attribute
        pass

    def method3(self):
        print self.instance_scope_attribute
查看变量名前面的
初始化中的
self


因此,您必须添加
self.
或将变量移动到类作用域,但要小心,因为类作用域属性是由所有实例共享的。

您必须在类作用域(静态属性)或实例作用域(在
\uuuuu init\uuu
中)中定义属性

因此,在类范围内,它看起来像:

class Cls(object):
    class_scope_attribute = 1

    @staticmethod
    def method1():
        print Cls.class_scope_attribute

    @classmethod
    def metdho2(cls):
        print cls.class_scope_attribute

    def method3(self):
        print Cls.class_scope_attribute
        print self.__class__.class_scope_attribute
在实例范围中:

class Cls2(object):
    def __init__(self):
        self.instance_scope_attribute

    @staticmethod
    def method1():
        # cannot access the instance_scope_attribute
        pass

    @classmethod
    def method2(cls):
        # cannot access the instance_scope_attribute
        pass

    def method3(self):
        print self.instance_scope_attribute
查看变量名前面的
初始化中的
self


因此,您必须添加
self.
或将变量移动到类作用域,但要小心,因为类作用域属性是由所有实例共享的。

如果您的目的真的是让
连接
一个
@staticmethod
,然后初始化
myhostname
myport
myuser
,和类级别的
mypassword
,如:

    class MyConnection:
        myhostname= hostnameValue
        myport= portValue
        myuser= userValue
        mypassword= passwordValue

        @staticmethod
        def connect():
            my_session = MyConnection()

            headers = {'content-type': 'application/json'}
            headers['Authorization'] = 'Basic ' + string.strip( base64.encodestring( MyConnection.myuser + ':' + MyConnection.mypassword ) )

            body = json.dumps({'username': MyConnection.myuser, 'password': MyConnection.mypassword,'services': ['platform', 'namespace']})

            my_session.connection = httplib.HTTPSConnection(MyConnection.myhostname, MyConnection.myport)
            my_session.connection.connect()

    MyConnection.connect()
或者,您可以将它们保留在
None
中,并在调用
connect()
之前给它们一个值

如果你想让
connect
成为一个实例方法,那么你就差不多做到了。您只需删除decorator
@staticmethod
,并进行一些其他更改:

    class MyConnection:
        def __init__(self, hostname, port, user, password):
            self.myhostname = hostname
            self.myport = port
            self.myuser = user
            self.mypassword = password

        def connect():
            headers = {'content-type': 'application/json'}
            headers['Authorization'] = 'Basic ' + string.strip( base64.encodestring(self.myuser + ':' + self.mypassword) )

            body = json.dumps({'username': self.myuser, 'password': self.mypassword, 'services': ['platform', 'namespace']})

            connection = httplib.HTTPSConnection(self.myhostname, self.myport)
            connection.connect()

    my_session= MyConnection(hostnameValue,portValue,userValue,passwordValue)
    my_session.connect()

如果您的目的确实是使
连接
成为
@staticmethod
,则在类级别初始化
myhostname
myport
myuser
mypassword
,如:

    class MyConnection:
        myhostname= hostnameValue
        myport= portValue
        myuser= userValue
        mypassword= passwordValue

        @staticmethod
        def connect():
            my_session = MyConnection()

            headers = {'content-type': 'application/json'}
            headers['Authorization'] = 'Basic ' + string.strip( base64.encodestring( MyConnection.myuser + ':' + MyConnection.mypassword ) )

            body = json.dumps({'username': MyConnection.myuser, 'password': MyConnection.mypassword,'services': ['platform', 'namespace']})

            my_session.connection = httplib.HTTPSConnection(MyConnection.myhostname, MyConnection.myport)
            my_session.connection.connect()

    MyConnection.connect()
或者,您可以将它们保留在
None
中,并在调用
connect()
之前给它们一个值

如果你想让
connect
成为一个实例方法,那么你就差不多做到了。您只需删除decorator
@staticmethod
,并进行一些其他更改:

    class MyConnection:
        def __init__(self, hostname, port, user, password):
            self.myhostname = hostname
            self.myport = port
            self.myuser = user
            self.mypassword = password

        def connect():
            headers = {'content-type': 'application/json'}
            headers['Authorization'] = 'Basic ' + string.strip( base64.encodestring(self.myuser + ':' + self.mypassword) )

            body = json.dumps({'username': self.myuser, 'password': self.mypassword, 'services': ['platform', 'namespace']})

            connection = httplib.HTTPSConnection(self.myhostname, self.myport)
            connection.connect()

    my_session= MyConnection(hostnameValue,portValue,userValue,passwordValue)
    my_session.connect()

classmethod
static方法
无法访问
\uuuu init\uuuu()方法中声明的变量。
因为
classmethod
staticmethod
绑定到类而不是类的对象,因此它们采用指向类而不是对象实例的类参数

\uuuu init\uuuu()
创建对象实例,因此
\uuuuu init\uuuu()
中声明的变量不能被
类方法
静态方法
访问,除非它们被声明为类变量


它们可以修改将应用于类的所有实例的类状态。例如,他们可以修改将适用于所有实例的类变量。

classmethod
静态方法
无法访问
\uuu init\uuu()方法中声明的变量。
因为
classmethod
staticmethod
绑定到类而不是类的对象,因此它们采用指向类而不是对象实例的类参数

\uuuu init\uuuu()
创建对象实例,因此
\uuuuu init\uuuu()
中声明的变量不能被
类方法
静态方法
访问,除非它们被声明为类变量


它们可以修改将应用于类的所有实例的类状态。例如,他们可以修改适用于所有实例的类变量。

这个问题与静态方法无关。错误在你的
\uuuuu init\uuuuuuuu
中:@Peter:[OT]帮个忙,用@spinus:谢谢你的建议,这不是我的代码-试图在不改造车轮的情况下造车!;)这个问题与静态方法无关。错误在你的
\uuuuu init\uuuuuuuu
中:@Peter:[OT]帮个忙,用@spinus:谢谢你的建议,这不是我的代码-试图在不改造车轮的情况下造车!;)我正在创建类“my_session=MyConnection()”的实例,所以我应该使用它来获取它的变量。duhhIm正在创建类“my_session=MyConnection()”的实例,因此我应该使用它来获取其变量。嗯