python 中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

啥子都不说,直接上例子来分析,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()

实例对象可以调用 实例方法、类方法、静态方法

类对象可以调用 类方法、静态方法

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值