python字典怎么设置_在python中设置字典中的属性

在python中设置字典中的属性

是否可以在python中从字典创建一个对象,使每个键都是该对象的属性?

像这样的东西:

d = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }

e = Employee(d)

print e.name # Oscar

print e.age + 10 # 42

我认为这几乎与这个问题相反:来自对象字段的Python字典

7个解决方案

124 votes

当然,这样的事情:

class Employee(object):

def __init__(self, initial_data):

for key in initial_data:

setattr(self, key, initial_data[key])

更新

正如Brent Nash建议的那样,您也可以通过允许关键字参数来使其更灵活:

class Employee(object):

def __init__(self, *initial_data, **kwargs):

for dictionary in initial_data:

for key in dictionary:

setattr(self, key, dictionary[key])

for key in kwargs:

setattr(self, key, kwargs[key])

然后你可以像这样调用它:

e = Employee({"name": "abc", "age": 32})

或者像这样:

e = Employee(name="abc", age=32)

或者甚至喜欢这样:

employee_template = {"role": "minion"}

e = Employee(employee_template, name="abc", age=32)

Ian Clelland answered 2019-04-26T17:51:53Z

35 votes

以这种方式设置属性几乎肯定不是解决问题的最佳方法。或者:

你知道所有领域应该提前做什么。 在这种情况下,您可以显式设置所有属性。 这看起来像

class Employee(object):

def __init__(self, name, last_name, age):

self.name = name

self.last_name = last_name

self.age = age

d = {'name': 'Oscar', 'last_name': 'Reyes', 'age':32 }

e = Employee(**d)

print e.name # Oscar

print e.age + 10 # 42

要么

你不知道所有领域应该提前做什么。 在这种情况下,您应该将数据存储为dict而不是污染对象命名空间。 属性用于静态访问。 这种情况看起来像

collections.namedtuple

另一个基本上与案例1相同的解决方案是使用collections.namedtuple.请参阅van的答案,了解如何实现这一点。

Mike Graham answered 2019-04-26T17:52:52Z

12 votes

您可以使用__dict__访问对象的属性,并在其上调用update方法:

>>> class Employee(object):

... def __init__(self, _dict):

... self.__dict__.update(_dict)

...

>>> dict = { 'name': 'Oscar', 'lastName': 'Reyes', 'age':32 }

>>> e = Employee(dict)

>>> e.name

'Oscar'

>>> e.age

32

Dave Kirby answered 2019-04-26T17:53:17Z

6 votes

如果你真的需要支持.name,我认为使用_asdict()的答案是可行的。

但是如果_asdict()对象只是一个可以使用点语法(.name)而不是dict语法(['name'])访问的结构,则可以像这样使用namedtuple:

from collections import namedtuple

Employee = namedtuple('Employee', 'name age')

e = Employee('noname01', 6)

print e

#>> Employee(name='noname01', age=6)

# create Employee from dictionary

d = {'name': 'noname02', 'age': 7}

e = Employee(**d)

print e

#>> Employee(name='noname02', age=7)

print e._asdict()

#>> {'age': 7, 'name': 'noname02'}

您可以使用_asdict()方法将所有属性作为字典访问,但以后只能在构造期间添加其他属性。

van answered 2019-04-26T17:53:56Z

6 votes

为什么不直接使用属性名作为字典的键?

class StructMyDict(dict):

def __getattr__(self, name):

try:

return self[name]

except KeyError as e:

raise AttributeError(e)

def __setattr__(self, name, value):

self[name] = value

您可以使用命名参数,元组列表或字典进行初始化,或者个别属性分配,例如:

nautical = StructMyDict(left = "Port", right = "Starboard") # named args

nautical2 = StructMyDict({"left":"Port","right":"Starboard"}) # dictionary

nautical3 = StructMyDict([("left","Port"),("right","Starboard")]) # tuples list

nautical4 = StructMyDict() # fields TBD

nautical4.left = "Port"

nautical4.right = "Starboard"

for x in [nautical, nautical2, nautical3, nautical4]:

print "%s %s" % (x.left,x.right)

或者,您可以为未知值返回None,而不是引发属性错误。 (web2py存储类中使用的技巧)

RufusVS answered 2019-04-26T17:54:34Z

5 votes

比如说

class A():

def __init__(self):

self.x=7

self.y=8

self.z="name"

如果要一次设置属性

d = {'x':100,'y':300,'z':"blah"}

a = A()

a.__dict__.update(d)

islam ezzat answered 2019-04-26T17:55:06Z

1 votes

类似于使用dict,你可以像这样使用kwargs:

class Person:

def __init__(self, **kwargs):

self.properties = kwargs

def get_property(self, key):

return self.properties.get(key, None)

def main():

timmy = Person(color = 'red')

print(timmy.get_property('color')) #prints 'red'

Alex Spencer answered 2019-04-26T17:55:31Z

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/542037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java ObjectInputStream readByte()方法与示例

ObjectInputStream类readByte()方法 (ObjectInputStream Class readByte() method) readByte() method is available in java.io package. readByte()方法在java.io包中可用。 readByte() method is used to read a byte (i.e. 8 bit) of data from this ObjectInputStream. re…

openresty—实现缓存前移

含义及理解: OpenResty(又称:ngx_openresty) 是一个基于 NGINX 的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。 其目标是让Web服务直接跑在Nginx服务内部,充分利用Nginx的非阻塞I/O模型&am…

Nginx+Keepalived+Tomcat之动静分离的web集群

NginxKeepalivedTomcat之动静分离的web集群 博客分类: webserverNginxKeepalivedTomcat之动静分离的web集群为小公司提供大概一天持续在100万/日之间访问的高性能、高可用、高并发访问及动静分离的web集群方案NginxKeepalived 高可用、反向代理NginxPHP …

安装完成后的配置_cent os7 默认安装后的一般配置

在安装cent os7后,进入系统会出现一些命令无法执行。这是因为最小化没有安装包含的软件包。这时候先要配置一下基本的IP参数,(包括动态,静态,或者是双网卡绑定)。我们在虚拟机中模拟操作一下,配置文件在/etc/sysconfig…

Java Integer类lowerOneBit()方法与示例

整数类lowerOneBit()方法 (Integer class lowestOneBit() method) lowestOneBit() method is available in java.lang package. minimumOneBit()方法在java.lang包中可用。 lowestOneBit() method is used to find at most only single 1’s bit from the rightmost side one b…

lnmp构架——对tomcat详解

tomcat的安装部署 安装jdk和tomcat tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/ tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/做好软连接便于访问 cd /usr/local ln -s jdk1.7.0_79/ java ln -s apache-tomcat-7.0.37/ tomcat配置环境变量 vim /etc/profile…

Linux 查找文件

find 查找目录 -name "文件名"find / -name "php.ini"locate 文件名locate php.ini 一:locate命令 locate命令用于查找文件,它比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作&#xff…

Java GregorianCalendar hashCode()方法与示例

GregorianCalendar类的hashCode()方法 (GregorianCalendar Class hashCode() method) hashCode() method is available in java.util package. hashCode()方法在java.util包中可用。 hashCode() method is used to returns the hash code for this GregorianCalendar. hashCode…

python元组为什么不可变_为什么python字符串和元组是不可变的?

我不知道为什么字符串和元组是不可变的;使它们不可变的优点和缺点是什么?除了Python解释器的内部实现,这种设计在编写程序上是否有很好的意义?(例如,如果元组和字符串是可变的,会更容易吗?)如果…

InnoDB事务结构体代码变量列表

事务结构 struct trx_t 写在前面 InnoDB是MySQL的一个存储引擎,支持事务,支持非堵塞的一致性读,物理存储结构是Page,每个事务都有回滚日志,重做日志,事务还会有死锁检测,各种各样不同的锁等等等…

对cookie与session的理解

cookie: 在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。 cookie的出现就是为了解决这个问题, 第一次登录后服务器返回一些数据(…

ubutun 更换网络源_Ubuntu 更换源

1.切换到root用户# su root备份源文件 目录:/etc/apt# cd /etc/apt/# cp sources.list sources.list.bk3.更换源 阿里源 清华源# >sources.list # 清空源# vim sources.list # 选择一个源,复制进去# apt update # 更新源,需要等几分钟# ex…

php : 常用函数

常用函数&#xff1a; <?php /*** 获取客户端IP* return [string] [description]*/ function getClientIp() {$ip NULL;if (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$arr explode(,, $_SERVER[HTTP_X_FORWARDED_FOR]);$pos array_search(unknown,$arr);if(false ! $po…

java日历类add方法_Java日历setFirstDayOfWeek()方法与示例

java日历类add方法日历类setFirstDayOfWeek()方法 (Calendar Class setFirstDayOfWeek() method) setFirstDayOfWeek() method is available in java.util package. setFirstDayOfWeek()方法在java.util包中可用。 setFirstDayOfWeek() method is used to sets the first day o…

zabbix监控部署 与添加主机

zabbix介绍&#xff1a; zabbix&#xff08;[zbiks]&#xff09;是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决…

线段树 洛谷 p1531 I hate it(I hate it too)

这里写链接内容 线段树模板 字符串是一个很诡异的问题。。。。 #include<cstdio> #include<iostream> #include<string> #define q 200000 using namespace std; int a[q5],s[q<<25]; void bu(int o,int l,int r)//建树 {if(lr){s[o]a[r];} else{int…

打开是什么样子的图片_情侣头像 | 无论是什么样子的你 我都好喜欢

点击【情侣图片大全】- 右上角找到【…】立刻设我为星标/置顶 - 不迷路哦情侣图片大全“时光真疯狂&#xff0c;我一路执迷与匆忙”情侣/闺蜜/动漫/闺蜜网名长按图片保存 点击图片放大图片高清&#xff0c;建议在 W i f i 下浏览这个世界是多么神奇我竟然遇见了你无论是什么…

Java File类File [] listFiles()方法(带示例)

File类File [] listFiles() (File Class File[] listFiles()) This method is available in package java.io.File.listFiles(). 软件包java.io.File.listFiles()中提供了此方法。 This method is used to return the names of all the files in the form of an array of files…

zabbix监控平台添加服务(http,nginx,mysql)

1 . 监控httpd服务&#xff1a; 首先确保已经搭建zabbix监控平台&#xff0c;并且将需要监控的主机已经添加。 对主机server2 上的http服务进行监控&#xff0c;首先确保server2主机安装了http服务。 使用http在zabbix中自带监控模版 点击配置->主机->server2->模…

java为什么要重写hashCode和equals方法

如果不被重写&#xff08;原生&#xff09;的hashCode和equals是什么样的&#xff1f;不被重写&#xff08;原生&#xff09;的hashCode值是根据内存地址换算出来的一个值。 不被重写&#xff08;原生&#xff09;的equals方法是严格判断一个对象是否相等的方法&#xff0…