面向对象类成员
面向对象类成员:字段,方法,属性
一、字段:
举个例子:
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
我们看看图形解说:
都是一一对应的关系,你用那种方式写就调用那个方法,属性的本质就是方法!