方法
静态方法
静态方法和静态属性一样,都是属于类本身,所以不需要实例化成对象就可以调用
class Person:
@staticmethod
def hello():
print('Hello World!')
Person.hello()
输出
Hello World!
静态方法:优点是不用创建对象即可调用,在频繁需要创建对象的情况下可以考虑使用静态方法来减少内存消耗
事实上@staticmethod
装饰器没有任何意义,不写也行,只不过通常为了标识下面方法是个静态方法才加上的
类方法
类方法顾名思义是类的方法,所以不需要实例化就可以调用,这点和静态方法很类似,不过他俩之间还是有一些区别的
class Person:
@classmethod
def hello(cls):
print('Hello World!')
Person.hello()
输出
Hello World!
实例方法、类方法与静态方法对比
从不同角度看实例方法、静态方法和类方法的不同
class A(object):
def foo(self, x):
print('Executing foo({}, {})'.format(self, x))
@classmethod
def class_foo(cls, x):
print('Executing class_foo({}, {})'.format(cls, x))
@staticmethod
def static_foo(x):
print('Executing static_foo({})'.format(x))
a=A()
print('\n从绑定情况来看')
print(a.foo)
print(A.class_foo)
print(A.static_foo)
print('\n从类型上来看')
print(type(a.foo))
print(type(A.class_foo))
print(type(A.static_foo))
输出
从绑定情况来看
<bound method A.foo of <__main__.A object at 0x000000000296A978>>
<bound method type.class_foo of <class '__main__.A'>>
<function A.static_foo at 0x00000000029772F0>
从类型上来看
<class 'method'>
<class 'method'>
<class 'function'>
绑定情况:
- 实例方法绑定在实例上
- 类方法绑定在类上
- 静态方法无绑定,所以它无法访问类变量
方法类型:
- 实例方法和类方法都是方法
- 静态方法是个普通函数
如何判断一个方法是什么类型的方法?
方法的作用域都属于类级,具体是实例方法、类方法还是静态方法,取决于第一个参数
- 如果第一个参数是实例的话,那就是实例方法
- 如果第一个参数时类的话,那就是类方法
- 如果不要求第一个参数的话,那就是静态方法
私有方法
私有方法和私有属性类似,都是只有在对象内部才能调用
class Person():
human = True
def __init__(self, name, gender):
self.Name = name
self.__Gender = gender
self.__Money = 100
@staticmethod
def Hello():
print('Hello World!')
def info(self):
print('Name: {} \nGender: {}'.format(self.Name, self.__Gender))
def __set_money(self, num):
self.__Money += num
def salary(self):
self.__set_money(1000)
print('Name: {} \nGerder: {} \nCurrent Money: {}'.format(self.Name, self.__Gender, self.__Money))
Da = Person('Da', 'male')
Da.salary()
输出
Name: Da
Gerder: male
Current Money: 1100
不过听说了一个奇淫技巧,通过这个技巧也可以通过通过外部访问到内部的私有方法
class Person():
human = True
def __init__(self, name, gender):
self.Name = name
self.__Gender = gender
self.__Money = 100
@staticmethod
def Hello():
print('Hello World!')
def info(self):
print('Name: {} \nGender: {}'.format(self.Name, self.__Gender))
def __set_money(self, num):
self.__Money += num
def salary(self):
self.__set_money(1000)
print('Name: {} \nGerder: {} \nCurrent Money: {}'.format(self.Name, self.__Gender, self.__Money))
@property
def money(self):
return self.__Money
Da = Person('Da', 'male')
Da._Person__set_money(2000)
print(Da.money)
输出
2100