python大作战之静态属性,静态方法,继承等综合代码练习

今天,更大家一起来学习一段基础代码,虽然是基础,但是这段代码覆盖的知识点还是很多的,涉及到@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)

 

你可能感兴趣的:(python基础)