面向对象类成员

面向对象类成员:字段,方法,属性

一、字段:

举个例子:

class Foo:
    def __init__(self, name):
        self.name = name

其中的self.name就是字段,不过这是一个普通的字段,保存在对象中,可以通过对象去访问例如:

1 obj = Foo("DJC")
2 print(self.name)
3 
4 >>>DJC

除了普通字段还有静态字段来看以下代码:

class Foo:

    s = 123

    def __init__(self, name):
        self.name = name

    def show(self):
        print(self.name)

这里面的s = 123 就是静态字段,保存在类里,可以通过类来访问例如:

print(Foo.s)
>>>123

 

tips:一般情况下:自己访问自己的字段

  规则:1、普通字段对象访问

     2、静态字段类访问

     3、通过对象可以访问类的字段,反过来不可以

 

 

二、方法

举个例子:

def show(self):
    print(self.name)

这个为普通方法,由对象去调用执行,方法属于类

当然也有静态方法,例如:

@staticmethod
def f1(a1, a2):
    print(a1, a2)

静态方法由类调用执行,你会发现静态方法没有self参数,而且有staticmethod装饰器装饰,这是与普通方法的不同之处

Foo.f1(11, 22)

>>>11,22

还有一种就是类方法,也是由类执行

@classmethod
def f2(cls):
    print(cls)

类方法至少要有一个参数cls,是class的缩写,且有一个classmethod装饰器装饰

Foo.f2()

>>><class '__main__.Foo'>

 

 

三、属性

举个例子:

Class Foo:
    
    def __init__(self, all_count):
        self.all_count = all_count
    # 具有方法的表示形式,字段的访问形式
@property # 用了property装饰器,当调用all_pager时就不用加小括号了,就像在取字段一样 def pager(self): a1, a2 = divmod(self.all_count, 10) if a2 == 0: return a1 else: return a1+1 # 字段可以通过赋值改变字段的值,那么用了property的方法能不能呢?可以的,例如 @pager.setter def pager(self, value): print(value) @pager.deleter def pager(self): print("del")

我们看看他的调用:

obj = Foo(107)
ret = obj.pager     # 不加小括号就能直接调用pager方法
print(ret)

>>>11


obj.pager = 'DJC'

>>>DJC        # 执行的是print(value)

del obj.pager

>>>del         # 执行的是print('del')

似乎有点不知所以然,我们可以来看看图形解说:

意思就是用另外一种形式去调用类里的方法,以上的方法还有另发一种形式:

 1 class Foo:
 2 
 3     def __init__(self, all_count):
 4         self.all_count = all_count
 5 
 6     def pager1(self):
 7         a1, a2 = divmod(self.all_count, 10)
 8         if a2 == 0:
 9             return a1
10         else:
11             return a1 + 1
12 
13     def pager2(self, value):
14         print(value)
15 
16     def pager3(self):
17         print("del")
18 
19     foo = property(fget=pager1, fset=pager2, fdel=pager3)
20 
21 obj = Foo(107)
22 ret = obj.foo
23 print(ret)
24 obj.foo = 'DJC'
25 del obj.foo

我们看看图形解说:

都是一一对应的关系,你用那种方式写就调用那个方法,属性的本质就是方法!

posted @ 2016-11-22 16:16  LearnerC  阅读(347)  评论(0编辑  收藏  举报