|
发表于 2018-4-27 22:37:59
|
显示全部楼层
,
本帖最后由 ABC23 于 2018-4-27 22:48 编辑
self.data = 1 # 这是为类实例之属性赋值
===============================
对比Java看其实非常简单:
public class Demo{
int data = 1; // Java的术语,这叫字段(field),即实例的属性
Demo(){}
public static void main(String[] args){
System.out.println(new Demo().data); // 这会打印1,每个实例对象都人手一份,各个实例的filed之间互不影响
}
}
回到Python:
Python的self(不是关键字)相当于Java的this(关键字)
class Demo:
def __init__(self):
self.data = 1
这等价于Java的字段赋值
——事实上,Python的__init__()方法同时担当了Java的:1. 字段赋值,2. 构造方法这重身份(并且init方法充当constructor的部分还不准确,因为它封装了new方法,那个才是构造实例时真正会调用的方法)。请看:
class Demo:
def __init__(self, item, price):
self.item = price
self.price = price
self. data = 100
这段代码同时表现了init方法作为字段赋值和构造方法的两重身份
为什么为字段赋值要写在init方法中?其实写在普通的成员方法中可是可以的:
>>> class Demo:
def f(self):
self.value = 1
>>> d = Demo()
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'f']
>>> d.value
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
d.value
AttributeError: 'Demo' object has no attribute 'value'
>>> d.f()
>>> d.value
1
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'f', 'value']
这体现了Python的动态类型之特点,比较灵活 |
|