class Province:
# 静态字段,属于类
country = '中国'
def __init__(self, name):
# 普通字段,属于对象
self.name = name
这里放到构造函数内部的字段叫做普通字段,在类中定义的字段称为静态字段
普通字段,保存在对象中,执行只能通过对象访问
静态字段,保存在类中,执行可以通过类或者对象访问
如果想调用普通字段,只能先创建对象obj = Province('beijing') 再通过obj.name进行调用
如果想调用静态字段,两种方式 Province.country 或者通过obj.country 通过类指针变量找到
类中的方法有三类:
普通方法:保存在类中,可以通过对象调用,也可以通过类调用,但是通过类调用一般不用
静态方法:保存在类中,通过装饰器@staticmethod,静态方法self参数不是必须的,通过类直接调用,也可以通过对象调用(一般不用)
类方法: 保存在类中、通过装饰器@classmethod,至少有一个参数,一般写成cls,这里 cls代指是类名,通过类直接调用,也可以通过对象调用(一般不用)
class Foo:
#普通方法
def normal_fun(self):
print('normal_fun')
#静态方法
@staticmethod
def static_fun():
print('static_fun')
#类方法
@classmethod
def class_fun(cls):
print(cls) # 看看cls到底是个什么鬼
print('class_fun')
obj = Foo()
obj.normal_fun()#调用普通方法
Foo.normal_fun(obj)#调用普通方法 这种方式一般不用
Foo.static_fun() # 静态方法调用
obj.static_fun() #静态方法也可以通过对象调用
Foo.class_fun() #类方法调用
obj.class_fun() #类方法也可以通过调用
执行结果如下:
normal_fun
normal_fun
static_fun
static_fun
<class '__main__.Foo'> #主函数入口下的Foo类
class_fun
<class '__main__.Foo'>
class_fun
这里self代指调用方法的对象,cls代指的是类,两个意义上是不一样的。
各类方法的应用场景如下:
1、如果对象中需要保存一些值,而调用方法需要使用对象中的值, 则用普通方法
2、如果不需要任何对象中的值,用静态方法或者类方法
最后说一下属性,属性这个东西介于字段和方法之间,他既有字段的表现方法,内容也有方法的体现。代码如下:
class Sha:
@property
def s_get(self):
print('模范get方法')
@s_get.setter
def s_get(self,val):
print(val)
@s_get.deleter
def s_get(self):
print('deleter')
obj = Sha()
obj.s_get
obj.s_get = 123
del obj.s_get
这里面s_get就相当于一个类属性,可以根据字段的形式进行获取,赋值,删除,不要问问什么,python的语法格式就是这么要求的。这样写就会去调用响应的功能方法。相当于跟字段的用法一样,其实执行的是方法。
上述代码执行结果打印为:
模范get方法
123
deleter
属性还有另外一种变现显示如下:
class Sha:
def s_get(self):
print('模范get方法')
def s_set(self,val):
print(val)
def s_del(self):
print('deleter')
handle = property(fget=s_get,fset=s_set,fdel=s_del)
obj = Sha()
obj.handle
obj.handle = 123
del obj.handle
这种表现形式没有第一种上面指定的装饰器,只需要通过property这个函数指定对应关系,调用方式是一样的。
上面的执行结果显示依旧是:
模范get方法
123
deleter