啥子都不说,直接上例子来分析,Python环境是python3
class Province(object):#类对象
country = "china" #公有类属性
__like = None # 私有类属性
def __init__(self,name):
#实例属性
self.name = name
def test(self):
'''定义一个实例方法,至少有一个self参数'''
self.cfunc("chinax")
self.sfunc()
@classmethod
def cfunc(cls,country):
'''定义类方法,至少有一个cls参数'''
print("cfunc()",cls)
cls.country = country
@staticmethod
def sfunc():
'''定义静态方法,无默认参数'''
print("sfunc()")
1:类对象、实例对象
定义一个类Province意味着在内存空间里有一个空间,类也是一个对象这就是类对象,用来生成实例对象的对象就是类对象
sh = Province("shanghai")
print(sh.name)
print(sh.country)
print(Province.country)
print("###################")
bj = Province("beijing")
print(bj.name)
print(bj.country)
print(Province.country)
sh,bj 就是实例对象,具体的创建过程就是首先调用__new__创建对象,申请一块内存空间,属性值都是随机的 然后调用__init__初始化,Python解析器自动把刚刚创建的对象传递到__init__的第一个参数,也就是self这个参数
2:类属性、实例属性
类属性:class 里边 def 外边定义的 都是属于类的属性,如说上边的country。类对象里边的属性就叫类属性,它是所有实例所共享的
实例属性:def 里边定义的 不一定是在__init__中定义都是实例属性,比如上边的name。实例对象里边的属性就叫实例属性
sh 和 bj 之所以能访问country,是因为有一个__class__的存在
如果实例对象想更改类对象的值时就要用到__class__
sh = Province("shanghai")
print(sh.name)
print(sh.country)
# sh.country = "china1"
sh.__class__.country = "china1"
print(sh.country)
print(Province.country)
print("###################")
bj = Province("beijing")
print(bj.name)
print(bj.country)
print(Province.country)
如果是sh.country = "china1" 这个写法,是改变不了类变量的值的。这种写法相当于是给sh这个实例对象定义一个country属性而且赋值了,sh独有的,结果如下
3:类方法,实例方法,静态方法
上边例子中的 cfunc 就是类方法,test()就是实例方法,sfunc就是静态方法
sh = Province("shanghai")
sh.cfunc("chinax")
print(sh.country)
Province.cfunc("chinay")
print(sh.country)
Python解析器会自动根据方法的类型 传递相应的变量,比如说调用的是cfunc,解析器会自动把类对象传进去,有了类对象 更改类变量就好办了。。。实例方法也是一样的,调用test()自动传递self这个实例对象
静态方法:
从上边的例子定义的sfunc()形式可以看出,静态方法跟实例方法和类方法 都不一样,它没有任何默认参数,也就是说它跟类对象和实例对象没有任何关系。所以完全可以在类外定义一个普通的函数来代替这个静态方法。
如果同一个py文件中只有一个类,上述做法完全没有任何问题。如果同一个py文件里边 有A类和B类,都想定义一个同名的sfunc()方法,但是功能各不相同,在类外定义普通函数的方法就行不通了,照顾了A就照顾不了B 照顾了B就照顾不了A,这个时候只能放到类里边了而且还不想让Python解析器传递任何对象,静态函数就排上用场了。。。
为啥要有静态方法:就是想干一些事情 还不想Python解析器传递任何参数
sh = Province("shanghai")
sh.test()
print("#############")
sh.cfunc("chinay")
sh.sfunc()
print("#############")
Province.cfunc("chinaz")
Province.sfunc()
实例对象可以调用 实例方法、类方法、静态方法
类对象可以调用 类方法、静态方法