[有趣的Python 3] 第一个类

[有趣的Python 3] 第一个类

既然Python是面向对象的语言,自然是支持类的定义的。现在就动手,来定义我们的第一个类:
记得吗?Python是以缩进来界定代码块的位置,而不是靠‘{’之类的符号。

[Copy to clipboard] [ - ]
CODE:
class MyClass:
    "A simple example class"
    i = 12345 #this is a field
    def __init__(self):
        self.perInstVar = 'a'

    def f(self):
        return 'hello world'

x = MyClass()
print x.f()

我们可以看到下面几点:
【1】 class的documentation comment是类似javadoc的东西
【2】 class包含data field和member function。 其中i是class variable,就是static的变量。而__init__()内部定义的是per instance variable。 __init__()是个特殊的函数,会在对象被构造的时候被调用。
【3】单行注释的写法
【4】member function的第一个参数一定是self,类似java里的this。这个需要显示传入,和java/c++是不一样的
【5】 可以看到class的初始化和调用方式
应该是self.i = 12345
否则i就是一个全局对象了
不需要写self.,否则会出错的。
不加self,就是shared class data,有点像Java的static变量

加了self,就是per-instance data,也就是实例变量了

[Copy to clipboard] [ - ]
CODE:
class MyClass:
   "A simple example class"

   i = 12345 # shared class data

   def __init__(self, value):  
       self.name = value # per-instance data

   def f(self):
       return 'Hello, ' + self.name

print MyClass.i

x = MyClass('wolfg')
print x.f()

print MyClass.f(x) # also can call as class method

那怎样定义一个只属于自己的变量呢?
[quote]原帖由 "bleem1998"]那怎样定义一个只属于自己的变量呢?[/quote 发表:

什么叫做“只属于自己的变量”呢?


[Copy to clipboard] [ - ]
CODE:
>;>;>; class ZZZ:
...   i=[]
...   def f(self):
...     self.i.append(0)
...
>;>;>; a=ZZZ()
>;>;>; b=ZZZ()
>;>;>; a.f()
>;>;>; b.i
[0]
>;>;>; a.f()
>;>;>; b.i
[0, 0]
>;>;>;               

修改b.i时a.i也变了
他们实际是同一个对象
如何定义i才可以让a、b都拥有自己的i呢?
我修改了一下帖子里的例子,这次清楚了一些


QUOTE:
原帖由 "bleem1998" 发表:
修改b.i时a.i也变了
他们实际是同一个对象
如何定义i才可以让a、b都拥有自己的i呢?

这是因为本来i就是属于这个class,所以所有这个class的instance都是共享这个i的。
如果要使用属于每个instance的变量,则在__init__中创建
self.i=12345
明白了
多谢