python 3.7 静态变量和内部变量的bug

3 篇文章 0 订阅
2 篇文章 0 订阅
# -*- coding=utf-8 -*-
import numpy as np
import os
import yaml
import logging
import re
import copy

from rich.console import Console
from rich.table import Table

from datetime import datetime
from common import common as c 
from functools import wraps
from runlog import log
from pathlib import Path
from threading import Thread, Lock

lock = Lock()

class vdict:
    v_columns_name = {}

    def __init__(self, name='', _list = []):
        self.__name = name 
        self.__list = _list
        self.__iter = 0
        self.__len = 0
        vdict.v_columns_name[self.__name] = []
        for i in range( len(_list)):
            vdict.v_columns_name[self.__name].insert(i, None) 

    def add_column(self, name, coltype):
        with lock:
            vdict.v_columns_name[self.__name].insert(self.__len, name+'|' +coltype)
            self.__list.insert(self.__len, None)
            self.__len = self.__len+1

    def set_column_name(self,i, name, coltype):
        with lock:
            vdict.v_columns_name[self.__name][i] = name+'|'+coltype


    def __next__(self):
        if self.__iter >=self.__len:
            raise StopIteration
        iteritem = self.__list[self.__iter]
        self.__iter += 1
        return iteritem

    def __iter__(self):
        self.__iter = 0
        return self

    def __len__(self):
        return self.__len

    def __getattr__(self, name):
        pass
    def __getitem__(self, key):
        return self.__list[key]
        
    def __setitem__(self, key, value):
        self.__list[key] = value

    def __getslice__(self, i, j):
        return self.__list[i:j]

    def __setslice__(self, i,j,value):
        self.__list[i:j] = value

    def __contains__(self, obj):
        return True if obj in self.list else False

    def print(self):
        table = Table(title = self.__name)
        for i in vdict.v_columns_name[self.__name]:
            table.add_column("None" if i is None else i , style="cyan", no_wrap=True)
        
        table.add_row(*[str(i) for i in self.__list])
        console = Console()
        console.print(table, justify="center")


c = vdict(name='c')
d = vdict(name='d')
e = vdict(name="e", _list=[])
f = vdict(name="f", _list=[])

c.add_column('c1', 'str')
c.add_column('c2', 'str')

e.add_column('e1', 'str')
e.add_column('e2', 'str')
f.add_column('f1', 'str')
f.add_column('f2', 'str')

c[0] = 1
c[1] = 2

c.print()
d.print()
e.print()
f.print()
e[0] = 1
e[1] = 2

f[0] = 3
f[1] = 4

e.print()
f.print()

我自定义了一个类,这个类的构造函数的参数在调用的过程中只传入少于定义参数个数的参数时,就会出现非静态变量 self.__list 在构造过程中变成了静态变量,注意 定义的vdict 类型的两个实例,c和d,这两个实例修改其中任何一个实例都会给另一个实例的内部成员变量带来修改。

可能使用 kwargs 这种方式可能会避免这个问题,但还没有完全改完,改完再看看结果。

class vdict:
    v_columns_name = {}

    def __init__(self, *args, **kwargs):
        print( args)
        print( kwargs)
        name = kwargs['name'] if 'name' in kwargs else ''
        _list = kwargs['_list'] if '_list' in kwargs else [] 
        self.__name = name 
        self.__list = _list
        self.__iter = 0
        self.__len = 0
        vdict.v_columns_name[self.__name] = []
        for i in range( len(_list)):
            vdict.v_columns_name[self.__name].insert(i, None) 

改完了,用这个可变参数就没有这个静态变量的问题了,所以使用python的这个参数可变的功能的时候务必使用这个可变参数,否则可能带来意想不到的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值