我如何通过从派生的 class 调用 class 方法来更新 class 变量
How can i update class variable by calling a class method from a derived class
我正在为测试目的开发一个名为 dbtest 的包。这个包是因为我使用 MySQLdb 连接数据库,因此在测试时编写 sql 查询是一项非常繁琐的任务。所以我创建了一个新包,所有查询都可以使用单独的函数访问。我避免使用 Django ORM,因为我的数据库 table 有多个外键和主键。
下面的礼物是包裹的一部分。
package.py
from django.test import TestCase
dbcon='connector'
class testcase(TestCase):
flag_user=[]
@classmethod
def setUpClass(cls):
global dbcon
dbcon=MySQLdb.connect(host=dbHost,port=dbPort,user=dbUser,passwd=dbPasswd,db=dbname)
super(testcase, cls).setUpClass()
cursor = dbcon.cursor()
sql=open("empty.sql").read()
cursor.execute(sql)
cursor.close()
views.MySQLdb=Mockdb()
@classmethod
def tearDownClass(cls):
dbcon.close()
def user_table(self,username=username,email=email):
cache=[username]
self.flag_user.append(cache)
cmpdata=(username,email)
insert_table(tablename_user,cmpdata)
def delete(self,table):
last_entry=self.flag_user[-1]
query_user = 'delete from USER where USERNAME=%s'
cursor=dbcon.cursor()
query=eval('query_%s'%table)
cursor.execute(query,last_entry)
dbcon.commit()
del self.flag_user[-1]
tests.py
from package import testcase
class showfiles(testcase):
def setUp(self):
print "setup2"
self.user_table(username='vishnu',email='vishnu@clartrum.com')
def tearDown(self):
print "teardown2"
self.delete("user")
def test_1(self):
print "test dbtest link feature"
def test_2(self):
print "test health/errorfiles with valid device"
self.user_table(username='vishnu',email='vishnu@clartrum.com')
包中的insert_table在sql中执行插入操作,删除方法删除用户的最后一个条目。 empty.sql
为数据库创建 tables。
实际上,当我 运行 测试时,最终 flag_user 应该只包含 [['vishnu']]
。但是我得到 [['vishnu'],['vishnu']]
,这是因为拆解中的删除功能没有更新值。
我认为这是由于 class 个实例造成的?我说的对不对?
此处:
class testcase(TestCase):
flag_user=[]
您将 flag_user
创建为 class 属性(所有实例共享)。
然后这里:
def user_table(self,username=username,email=email):
cache=[username]
self.flag_user.append(cache)
您附加到(class 级别)flag_user
属性(它是通过实例访问的,但它仍然是 class 属性)
但是这里:
def delete(self,table):
delete_table(tablename)
self.flag_user=[]
您在实例本身上创建了一个 flag_user
属性,它与同名 class 属性完全断开。
最简单的解决方案是从一开始就使用实例属性,而不是使用 class 属性:
# package.py
from django.test import TestCase
dbcon='connector'
class testcase(TestCase):
def setUp(self):
self.flag_user = []
并且不要忘记在 child classes:
中调用 testcase.setUp
# tests.py
from package import testcase
class showfiles(testcase):
def setUp(self):
super(showfile, self).setUp()
self.user_table(username='vishnu',email='vishnu@clartrum.com')
如果你真的想要一个 class 属性(我无法想象你为什么会但是......)的替代解决方案是修改 testcase.delete()
所以它真的清除了 flag_user
class 属性而不是创建实例属性,这是通过明确要求 python 将属性重新绑定到 class 本身来完成的(type(obj)
returns obj.__class__
实例所属的 class):
def delete(self,table):
delete_table(tablename)
type(self).flag_user = []
我正在为测试目的开发一个名为 dbtest 的包。这个包是因为我使用 MySQLdb 连接数据库,因此在测试时编写 sql 查询是一项非常繁琐的任务。所以我创建了一个新包,所有查询都可以使用单独的函数访问。我避免使用 Django ORM,因为我的数据库 table 有多个外键和主键。
下面的礼物是包裹的一部分。
package.py
from django.test import TestCase
dbcon='connector'
class testcase(TestCase):
flag_user=[]
@classmethod
def setUpClass(cls):
global dbcon
dbcon=MySQLdb.connect(host=dbHost,port=dbPort,user=dbUser,passwd=dbPasswd,db=dbname)
super(testcase, cls).setUpClass()
cursor = dbcon.cursor()
sql=open("empty.sql").read()
cursor.execute(sql)
cursor.close()
views.MySQLdb=Mockdb()
@classmethod
def tearDownClass(cls):
dbcon.close()
def user_table(self,username=username,email=email):
cache=[username]
self.flag_user.append(cache)
cmpdata=(username,email)
insert_table(tablename_user,cmpdata)
def delete(self,table):
last_entry=self.flag_user[-1]
query_user = 'delete from USER where USERNAME=%s'
cursor=dbcon.cursor()
query=eval('query_%s'%table)
cursor.execute(query,last_entry)
dbcon.commit()
del self.flag_user[-1]
tests.py
from package import testcase
class showfiles(testcase):
def setUp(self):
print "setup2"
self.user_table(username='vishnu',email='vishnu@clartrum.com')
def tearDown(self):
print "teardown2"
self.delete("user")
def test_1(self):
print "test dbtest link feature"
def test_2(self):
print "test health/errorfiles with valid device"
self.user_table(username='vishnu',email='vishnu@clartrum.com')
包中的insert_table在sql中执行插入操作,删除方法删除用户的最后一个条目。 empty.sql
为数据库创建 tables。
实际上,当我 运行 测试时,最终 flag_user 应该只包含 [['vishnu']]
。但是我得到 [['vishnu'],['vishnu']]
,这是因为拆解中的删除功能没有更新值。
我认为这是由于 class 个实例造成的?我说的对不对?
此处:
class testcase(TestCase):
flag_user=[]
您将 flag_user
创建为 class 属性(所有实例共享)。
然后这里:
def user_table(self,username=username,email=email):
cache=[username]
self.flag_user.append(cache)
您附加到(class 级别)flag_user
属性(它是通过实例访问的,但它仍然是 class 属性)
但是这里:
def delete(self,table):
delete_table(tablename)
self.flag_user=[]
您在实例本身上创建了一个 flag_user
属性,它与同名 class 属性完全断开。
最简单的解决方案是从一开始就使用实例属性,而不是使用 class 属性:
# package.py
from django.test import TestCase
dbcon='connector'
class testcase(TestCase):
def setUp(self):
self.flag_user = []
并且不要忘记在 child classes:
中调用testcase.setUp
# tests.py
from package import testcase
class showfiles(testcase):
def setUp(self):
super(showfile, self).setUp()
self.user_table(username='vishnu',email='vishnu@clartrum.com')
如果你真的想要一个 class 属性(我无法想象你为什么会但是......)的替代解决方案是修改 testcase.delete()
所以它真的清除了 flag_user
class 属性而不是创建实例属性,这是通过明确要求 python 将属性重新绑定到 class 本身来完成的(type(obj)
returns obj.__class__
实例所属的 class):
def delete(self,table):
delete_table(tablename)
type(self).flag_user = []