静态属性、类方法、静态方法

@property 将函数属性伪装成数据属性  静态属性

@classmethod #类方法,专门给类使用,与实例无关,类方法只能访问类相关的属性,不能访问实例属性(与实例无关。。。)

@staticmethod #类的工具包,staticmethod静态方法只是名义上的归属类管理,不能使用类变量和实例变量

class Student:
    date = 'testdate'
    #姓名,性别,年龄
    def __init__(self,stu_name,stu_sex,stu_age,length,width,heigh):
        self.stu_name = stu_name
        self.stu_sex = stu_sex
        self.stu_age = stu_age
        self.length = length
        self.width = width
        self.heigh = heigh

    @classmethod    #类方法,专门给类使用,与实例无关,类方法只能访问类相关的属性,不能访问实例属性(与实例无关。。。)
    def go_school(cls,x):
        print('--->',cls,cls.date,x)

    # def go_school(self):#,vehicle
    #     print('%s骑着一个风似风火似火的上学了'%self.stu_name)#,vehicle
    #     return 1

    @property       #将函数属性伪装成数据属性
    def cal_area(self):
        print('%s 身高%s身宽%s 体积%s'%(self.stu_name,self.heigh,self.width,self.heigh*self.width))

    @staticmethod   #类的工具包,staticmethod静态方法只是名义上的归属类管理,不能使用类变量和实例变量
    def test1(x,y):     #类和实例都可以调用
        print(x,y)

    def test2(x,y):     #没有任何意义,类可调用,实例不能调用,self自动传
        print(x,y)

stu1 = Student('李大江','',18,2,0.2,2)
# print(stu1.cal_area)    #函数属性伪装成数据属性的方式去调用
# print(stu1.stu_name)
Student.go_school(1)

 

实例:只有数据属性
类:有数据属性和函数属性

实例对象:可以调用类的数据属性和函数属性(依据函数作用域)

@property(静态属性)---->将函数属性,伪装成数据属性访问
类:不能调用  (调用只能拿到一个内存地址,并不会执行(拿到内存地址没什么用))
实例:可以调用

@classmethod(类方法)---->与类绑定,与实例无任何关系
类:可以调用
实例:不可以调用    (其实可以调用d1.test_classmethod(),不会出错,但是一般不会这样定义和调用)

@staticmethod(静态方法-类的工具包)---->不与类绑定,也不与对象绑定,名义上归属类管理,但是不能调用类属性和实例属性
类:可以调用
实例:可以调用

class Desk_base(object):
    def f2(self):
        pass


class Desk(Desk_base):
    i = 'i类属性' #类属性

    #类:不可以调用
    #实例对象:可以调用
    #实例属性
    def __init__(self,name,width,length,heigh):
        self.name = name    #实例属性
        self.width = width
        self.length = length
        self.heigha = heigh

    #类:可以调用
    #实例:不可以调用
    #定义函数属性,但是没有任何意义,没有这样定义的,但不是错误
    def test_not_self():
        print('没有传self的方法')

    #类:可以调用
    #实例:可以调用
    #类的函数属性
    def test_self(self):
        print('类的普通方法')
        return self.name

    #类:不能调用(调用只能拿到一个内存地址,并不会执行)
    #实例:可以调用
    #与实例绑定,将函数属性,伪装成数据属性
    @property # 静态属性
    def test_property(self):
        return self.name

    #类:可以调用
    #实例:不可以调用(其实可以调用d1.test_classmethod(),不会出错,但是一般不会这样定义和调用)
    #与类绑定,与实例无任何关系
    @classmethod    #类方法
    def test_classmethod(cls):
        '''
        类方法不能调用实例属性
        可以调用类方法或类属性
        :return:
        '''
        return cls.i

    #类:可以调用
    #实例:可以调用
    #不与类绑定,也不与对象绑定,名义上归属类管理,但是不能调用类属性和实例属性
    @staticmethod   #静态方法(类的工具包)
    def test_staticmethod():
        return '静态方法'


d1 = Desk('zk',100,100,101)
'''
实例:只有数据属性
类:有数据属性和函数属性

实例对象:可以调用类的数据属性和函数属性(依据函数作用域)

@property(静态属性)---->将函数属性,伪装成数据属性访问
类:不能调用  (调用只能拿到一个内存地址,并不会执行(拿到内存地址没什么用))
实例:可以调用

@classmethod(类方法)---->与类绑定,与实例无任何关系
类:可以调用
实例:不可以调用    (其实可以调用d1.test_classmethod(),不会出错,但是一般不会这样定义和调用)

@staticmethod(静态方法-类的工具包)---->不与类绑定,也不与对象绑定,名义上归属类管理,但是不能调用类属性和实例属性
类:可以调用
实例:可以调用
'''

 

posted @ 2016-12-22 09:35  总要做些什么  阅读(256)  评论(0编辑  收藏  举报