What is the difference between declaring data attributes inside or outside __init__
来源:互联网 发布:布鲁斯 知乎 编辑:程序博客网 时间:2024/06/05 17:26
https://stackoverflow.com/questions/13844804/what-is-the-difference-between-declaring-data-attributes-inside-or-outside-ini
https://stackoverflow.com/questions/207000/python-difference-between-class-and-instance-attributes
I'm trying to get my head around OOP in Python and I'm a bit confused when it comes to declare variables within a class. Should I declare them inside of the__init__
procedure or outside it? What's the difference?
The following code works just fine:
# Declaring variables within __init__class MyClass: def __init__(self): country = "" city = "" def information(self): print "Hi! I'm from %s, (%s)"%(self.city,self.country)me = MyClass()me.country = "Spain"me.city = "Barcelona"me.information()
But declaring the variables outside of the __init__
procedure also works:
# Declaring variables outside of __init__class MyClass: country = "" city = "" def information(self): print "Hi! I'm from %s, (%s)"%(self.city,self.country)me = MyClass()me.country = "Spain"me.city = "Barcelona"me.information()
In your first example you are defining instance attributes. In the second,class attributes.
Class attributes are shared between all instances of that class, where as instance attributes are "owned" by that particular instance.
Difference by example
To understand the differences let's use an example.
We'll define a class with instance attributes:
class MyClassOne: def __init__(self): self.country = "Spain" self.city = "Barcelona" self.things = []
And one with class attributes:
class MyClassTwo: country = "Spain" city = "Barcelona" things = []
And a function that prints out information about one of these objects:
def information(obj): print "I'm from {0}, ({1}). I own: {2}".format( obj.city, obj.country, ','.join(obj.things))
Let's create 2 MyClassOne
objects and change one to be Milan, and give Milan "something":
foo1 = MyClassOne()bar1 = MyClassOne()foo1.city = "Milan"foo1.country = "Italy"foo1.things.append("Something")
When we call information()
on the foo1
and bar1
we get the values you'd expect:
>>> information(foo1)I'm from Milan, (Italy). I own: Something>>> information(bar1)I'm from Barcelona, (Spain). I own:
However, if we were to do exactly the same thing, but using instances of MyClassTwo
you'll see that the class attributes are shared between instances.
foo2 = MyClassTwo()bar2 = MyClassTwo()foo2.city = "Milan"foo2.country = "Italy"foo2.things.append("Something")
And then call information()
...
>>> information(foo2)I'm from Milan, (Italy). I own: Something>>> information(bar2)I'm from Barcelona, (Spain). I own: Something
So as you can see - things
is being shared between the instances.things
is a reference to a list that each instance has access to. So if you append to things from any instance that same list will be seen by all other instances.
The reason you don't see this behaviour in the string variables is because you are actually assigning a new variable to an instance. In this case that reference is "owned" by the instance and not shared at the class level. To illustrate let's assign a new list to things for bar2
:
bar2.things = []
This results in:
>>> information(foo2)I'm from Milan, (Italy). I own: Something>>> information(bar2)I'm from Barcelona, (Spain). I own:
- What is the difference between declaring data attributes inside or outside __init__
- What is the difference between XML and C or C ?
- What is the difference between Initializing and Assignment inside a constructor?
- What is the Difference Between Proxy Types?
- What is the difference between test, [ and [[ ?
- What is the difference between Simple, Advanced and Parameter data sets?
- What’s the difference between “Array()” and “[]” while declaring a JavaScript array?
- what is the difference between the setTimeout and setInterval
- What is the difference between DHTML and the DOM?
- What is the difference between the mouseover and mouseenter events?
- What is the difference between the three mentioned verbs?
- What is the difference between AWT and SWT?
- What is the difference between User Control and Custom Control?
- ABAP--what is the difference between V1 ,V2&V3 update?
- ABAP--what is the difference between V1 ,V2&V3 update?
- What is the difference between an EXE and a DLL?
- What is the difference between SMOD and CMOD?
- what is the difference between little-endian and big-endian.
- 2017年大数据开发HuaWei笔试题两道(AC)
- 正则表达式的支持
- 对字符串进行直接插入排序、堆排序、归并排序、快速排序实现以及性能分析
- Alibaba Java Coding Guidelines使用
- 起售价近5500,嘲讽了iPhone X的华为Mate 10却没用上人脸识别
- What is the difference between declaring data attributes inside or outside __init__
- 目标检测中KITTI数据集的简介与使用
- oracle、sql server查询前10条数据
- 第十一篇 Android Studio配置gradle实现一键打包以及自定义apk的文件名
- greenplum 日期及时间函数及时间的加减
- 加固、友盟统计、渠道打包
- mysql的简单操作
- JFreeChart动态生成饼图
- 吴恩达招实习生了!90分钟112人申请!!