一、实例方法,静态方法,类方法,是不是有点让人挠头,怎么选择?
直接上代码
class Example:
name='sky is blue'
def __init__(self,title):
self.title = title
def instance_method(self):
print('i am a {} method'.format('instance'))
@staticmethod
def static_method():
print('i am a {} method'.format('static'))
@classmethod
def class_method(cls):
print('i am a {} method'.format('class'))
def method(self):
print('i am a {} method'.format('instance'))
@staticmethod
def method():
print('i am a {} method'.format('static'))
@classmethod
def method(cls):
print('i am a {} method'.format('class'))
测试如下:
example=Example()
# 实例可以调用所有所有种类的方法
example.instance_method()
example.static_method()
example.class_method()
# 类可以调用static和class方法
Example.static_method()
Example.class_method()
# 类调用实例方法的时候,需要将实例作为参数
Example.instance_method(example) #这里的example相当于self
说明:
- 实例可以调用三种方法
- 类可以调用静态方法和类方法
- 静态方法和类方法的不同在于:静态方法通过经过子类继承父类操作后,调用子类的静态方法的时候,实际是调用父类的静态方法;而类方法中,调用子类的类方法就是子类的方法,虽然这个方法继承自父类。当然还有在定义的时候,类方法需要有一个class做参数。
- 不同种类的方法在定义的时候,可以重名。在重名的情况下,类方法是具备优先权的。
二、定义类过程中的变量的处理
class Example:
name='sky is blue'
def __init__(self,title):
self.title = title
# 静态方法调用类变量
@staticmethod
def static_method():
print('i am a {} var'.format(Example.name))
# 类方法调用类变量
@classmethod
def class_method(klass):
print('i am a {} var'.format(Example.name))
print('i am a {} var'.format(klass.name))
def set_class_val(self,val):
Example.name=val
class ExampleChild(Example):
pass
class ExampleChild1(Example):
pass
example = Example('hello world')
# 类变量可以在实例和类中都可以被调用
print(example.name)
print(Example.name)
example_child = ExampleChild('hello child\'s world')
example_child.set_class_val('sky is red')
example_child1= ExampleChild1('hello child1\'s world')
# 见证奇迹的时候到了
print(Example.name)
print(example.name)
print(ExampleChild.name)
print(example_child.name)
print(example_child1.name)
# 结果都是sky is red
说明:
- 类变量太容易被修改了,即使子类调用了一个实例方法,都可以将父类的变量修改掉。同时其他子类的使用类变量的时候,也是一个变化后的变量。
- 基于上面的认知,类变量的使用应该是极其谨慎才好。
网友评论