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)
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