今天,更大家一起来学习一段基础代码,虽然是基础,但是这段代码覆盖的知识点还是很多的,涉及到@Classmethod
,@staticmethod,@property,静态方法__hobby,类变量,实例变量等
class people(object):
name='张三'
def __init__(self,name,age=10):
self.name=name
self.__age=age
self.__hobby=None
self._shop='购物'
def running(self):
print('%s跑步'%self.name)
@classmethod
def walk(cls):
return cls.name
@staticmethod
def eat(self,foods):
print('%s 要吃%s'%(self.name,foods))
@property
def hobby(self):
return self.__hobby
@hobby.setter
def hobby(self,food):
self.__hobby=food
class man(people):
def __init__(self,name,sex):
self.sex=sex
super(man,self).__init__(name,age=10)
def call(self):
print('我的性别是%s'%self.sex)
def running(self):
print('%s 在跑步'%self.name)
1->首先我们来对@staticmethod做一下说明:实际上跟类没有关系,只是类下面的一个函数,调用的时候需要用类名
所以,调用时需要传入一个实例,不要问为什么,就是这样规定的
p.eat(p,'牛肉'),同理继承父类的子类也能调用这个方法,m.eat(m,'牛肉 too')
2->我们也可以来看下作用域的知识点:从代码中可以看到类属性中有个name,实例属性中有个name,在不删除任意一个的情况下,我们实例化后可以用实例对象p来调用实例对象中的name,但是不能调用类属性中的name,但是当我们把实例对象中的name属性删除,这时候实例调用调用name时,只能输出类属性的值
3->我们来看下伪静态方法@property,这个在我之前的文章中也做了解释,相当于其他语言比如java中的set和get方法,鉴于python没有这些方法,所以用@property来运行,
实例对象这样调用时p.hobby='面包',就已经触发了@hobby.setter这个装饰器,其次print(p.hobby)就触发了@property装饰器,但是需要注意的是被@property装饰的方法只能看着是一个属性,不能加()来调用
4:->我们来看下类方法@classmethod,类方法只能访问类变量,不能访问实例变量,所以当我们调用p.walk(),就知道这个name调用的是类的还是实例对象的
5->还有一个self._shop=购物,这个的特点就是只能被实例对象或者子类对象调用,不能被类直接调用
还有一些可以从我的代码中得知:
p=people('fjh')
print(p.hobby)
p.hobby='set后吃包子'
print(p.hobby)
print(p.__dict__)
print(p._people__age)
print(p.walk())
print(p._shop)
p.running()
m=man('fhh','男')
m.call()
m.running()
print(m._shop)
print(m.__dict__)
print(m._people__age)