python学习笔记-实例方法、类方法、静态方法、属性方法及__new__方法

class A(object):
    m = 20
    #实例方法
    def __init__(self):
        self.x = 10
    def fun(self):
        print("fun")
    #类方法
    @classmethod
    def class_test(cls):
        cls.m = 30

    #静态方法
    @staticmethod
    def static_test():
        print("this is test")

a = A()
a.class_test()
print(A.class_test())
print(a.m)
print(A.m)
a.static_test()
A.static_test()
a.fun()

output

None
30
30
this is test
this is test
fun

实例方法可以通过创建的类对象的引用去调用,不能通过类名.实例方法进行调用。实例方法需要传入self参数,即实例对象的引用。
但是: 类方法和静态方法可以通过类对象引用和类名去调用。
类方法主要用来修改类变量,当然你也可以通过类名.类变量进行修改,类方法需要传入cls参数,即指向该类,因为类也是对象。

    @classmethod
    def class_test(cls):
        cls.m = 30
        print("cls in classmethod",cls)
A.class_test()
a.class_test()
out-------------------------------------
cls in classmethod <class '__main__.A'>
cls in classmethod <class '__main__.A'>

静态方法在括号里不需要传入什么参数,其实就是我们常用的函数,只不过我们在开发的时候用面向对象而不是面向过程,所以最好也把函数包装成方法。静态方法一般和创建的实例对象和该类没有什么关系。当然你也可以传入self参数,不过这个self参数并没有像别的方法中的self参数指向这个实例,而是告诉你需要传入A的实例对象,或者这个A类

@staticmethod
def static_test(self):
print(“self in staticmethod : “,self)
a.static_test(A)
A.static_test(A)
a.static_test(a)
A.static_test(a)

out———————————————————–
self in staticmethod :

#####

2位不同的老师讲的课,知识点的方面不尽相同,可以互补。最近越发觉得做生物是在浪费生命了,离开的感觉愈来愈强烈。不过也有各种事由,无法脱身。理科男就是这样,心里有无限的想法,每次写的时候却发现写的如此枯燥,,不写也罢。20180110

属性方法:
如果你要写一个银行系统,你直接把bank.balance 暴露暴露出去,到时可以随意更改,比如 把self.balance = -1000,银行系统可不会白白让你欠钱,这样显然不太好。这时,我们可以用set和get方法

class Bank(object):
    def __init__(self,name):
        self.name = name

    def get_balance(self):
        return "客户 %s 的余额是 %s" % (self.name,self.__balance)

    def set_balance(self,value):
        if not isinstance(value,int):
            raise ValueError("value must be integer")
        if value < 0:
            raise ValueError("value must > 0")
        else:
            self.__balance = value

bank = Bank("Tom")
bank.set_balance(100)
print(bank.get_balance())

通过上面代码,你就不能设置bank.balance = -1000,这样就符合逻辑了。下面用属性方法做类似的功能

class Bank(object):
    def __init__(self,name):
        self.name = name

    @property
    def balance(self):
        return "客户 [%s] 的账户余额为 [%s] " % (self.name,self.account)

    @balance.setter
    def balance(self,value):
        if not isinstance(value,int):
            raise ValueError("value must be Integer")
        if value < 0:
            print("value must >0")

        else:
            self.account = value
    @balance.deleter               #删除account属性
    def balance(self):
        del self.account

bank = Bank("Tom")
bank.balance = 100    #有了setter 就可以设置属性值
print(bank.balance)
print(bank.account)
del bank.balance     # 执行balance方法,删除account属性
print(bank.balance)

_new_方法和_init_方法

1,两个功能相似,但是如果都存在new先执行;
2,new方法必须要返回一个实例化的对象;
3,init方法没有返回值;
4,new有一个参数cls,init有一个参数self即为new返回的实例对象。
python创建实例是调用object类中的new方法,如单例模式就是用的new方法

class Earth(object):  
    __instance=None 

    def __new__(cls):  

        if cls.__instance==None:  
            cls.__instance = super(Earth,cls).__new__(cls) # 继承父类的时候只有当是self的时候不用重写。比如 super(Home, self).dispatch(request, *args, **kwargs)
            # cls.__instance = object.__new__(cls)  
            return  cls.__instance  
        else:  
            #返回上一个对象的引用  
            return cls.__instance  

a = Earth()  
print(id(a))  
b = Earth()  
print(id(b))
###############################
42894672
42894672  

你可能感兴趣的:(python学习笔记)