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