python-33 面向对象之二:静态、组合、继承

# 类的静态属性:把函数属性变成数据属性,这样进行了伪装,表面上看是数据属性,实质是函数属性,静态方法语法糖:@property
a='aa'
b='bb'
class Room():
    tag='建筑物'  #类的静态属性
    def __init__(self,name,long,width):
        self.long=long
        self.width=width
        self.name=name
    @property    #在方法属性前加上 @property,使该方法属性变成了类的静态属性,调用方法:实例.方法名,作用:伪装成静态属性,让用户不知道其内部逻辑
    def cal_area(self):
        print('%s房子的面积是%d'%(self.name,self.width*self.long))

    def owner(self):
        print('this is %s hours'%self.name)

    #类方法:将方法属性只跟类绑定,与实例无关,语法糖@classmethod,在类字典中
    @classmethod
    def tell_info(cls):#自动填入cls,即与类绑定
        print('类型--->',cls.tag)

    #类静态方法:与类和实例都不绑定,它只是名义归属类管理,不能使用类变量和实例变量,是类的工具包,语法糖@staticmethod
    @staticmethod
    def test(a,b):   #不自动填入cls和self,表明不和任何绑定,类和实例都可调用
        print('%s 和 %s正在玩耍'%(a,b))
        #print(self.width) 不能使用实例变量
        #print(cls.tag)    也不能使用类变量

r1=Room('xm',1,5)
r2=Room('mf',30,50)
r1.cal_area #变成静态属性后, r1.cal_area()变成调用属性一样r1.cal_area
r2.cal_area # r2.cal_area()--》r2.cal_area
Room.owner(r1)#一般方法属性,用类调用时,必需传入一个实例对象,类型---> 建筑物
Room.tell_info()#类方法,用类调用,就不用传入实例对象了,这样与实例无任何关系了
Room.test('小红','小白')#小红 和 小白正在玩耍
r1.test('小黑','小王')#小黑 和 小王正在玩耍
r2.test(a,b)#aa 和 bb正在玩耍
View Code

猜你喜欢

转载自www.cnblogs.com/Zhouzg-2018/p/10279934.html