Python3基础-静态属性、类方法、静态方法、

1、静态属性

类有两种属性:数据属性和函数属性

在使用实例调用类的函数属性并运行时,需要带上函数的后面括号才能运行,不然总是调用函数的内存地址,如:

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    def info(self):
        print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))

    def displaycount(self):
        print("Total empcount %d"%student.empcount)

stu1 = student('susu','',29)
#调用数据属性
print(stu1.name)
print(stu1.sex)

#调用函数属性
stu1.info() #函数后面的括号每次都必须要带上  输出:姓名:susu, 性别:女,年龄:29
print(stu1.info)  #输出:<bound method student.info of <__main__.student object at 0x02C10030>>

问题:如何像调用数据函数一样调用函数属性

类中提供了@property关键字,在函数前加@property,将函数逻辑”封装“成数据属性,外部直接调用函数名,如同调用属性一样。这个函数是可以调用对象和类的属性的。

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    @property
    def info(self):
        print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))

    def displaycount(self):
        print("Total empcount %d"%student.empcount)

stu1 = student('susu','',29)
#调用数据属性
print(stu1.name)
print(stu1.sex)

#调用函数属性
stu1.info  #输出:姓名:susu, 性别:女,年龄:29
#stu1.info() #就会报错  TypeError: 'NoneType' object is not callable

stu1.displaycount() #Total empcount 1
print(stu1.displaycount) #<bound method student.displaycount of <__main__.student object at 0x007E0030>>

2、类方法

如果要求,不进行实例化,直接调用类的函数,此时会提示缺少必要的位置参数self

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    @property
    def info(self):
        #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))
        return  self.name,self.sex

    def displaycount(self):
        print("Total empcount %d"%student.empcount)

student.displaycount() #TypeError: displaycount() missing 1 required positional argument: 'self'

虽然我们可以随意加上位置参数,但是注意到此处的self有特殊含义,它是指实例的本身,也就是说要使用self必须要先实例化才行

在类的方法前添加@classmethod,不需要实例化,直接调用类的该方法。可以访问类的数据属性,但是不可以访问对象的数据属性。

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    @property
    def info(self):
        #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))
        return  self.name,self.sex

    @classmethod
    def displaycount(self):
        print("Total empcount %d"%student.empcount)

        #print(self.name) 会报错,因为name是对象的数据属性,而类方法是不可以访问实例的属性
        #print(self.name) AttributeError: type object 'student' has no attribute 'name'
student.displaycount() #就可以直接调用成功 Total empcount 0

类的函数里面有多个形参

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    @property
    def info(self):
        #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))
        return  self.name,self.sex

    @classmethod
    def displaycount(self,x):
        print("Total empcount %d;x===%s"%(student.empcount,x))
student.displaycount('我是x的值') #只要传入x的值就可以了

3、静态方法

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    @property
    def info(self):
        #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))
        return  self.name,self.sex

    @classmethod
    def displaycount(self,x):
        print("Total empcount %d;x===%s"%(student.empcount,x))

    def test(x,y):
        print("%d,%d相加的值是%d"%(x,y,x+y))

student.test(1,3) #1,3相加的值是4
stu1=student('susu','位置',18)
stu1.test(1,3) #就会报错 TypeError: test() takes 2 positional arguments but 3 were given
#通过实例来访问test(x,y),虽然传入的是2个参数,但是实际python自动默认首位输入了self;(传的是2个参数,收到的是3个参数)

在类的方法前加@staticmethod,该方法只是名义上的归属类管理,实例和类的属性均不可以访问,仅仅是类的工具包

class student:
    '学生的信息'
    info_stu = "打印学生的信息"
    empcount = 0
    def __init__(self,name,sex,age):
        self.name= name
        self.sex = sex
        self.age = age
        student.empcount += 1

    @property
    def info(self):
        #print("姓名:%s, 性别:%s,年龄:%s"%(self.name,self.sex,self.age))
        return  self.name,self.sex

    @classmethod
    def displaycount(self,x):
        print("Total empcount %d;x===%s"%(student.empcount,x))

    @staticmethod
    def test(x,y):
        print("%d,%d相加的值是%d"%(x,y,x+y))
        print("类的属性",student.info_stu) #可以正常访问类的数据属性
        #print("实例的属性",self.name) #会报错,因为test()没有self 传入  NameError: name 'self' is not defined

student.test(1,3) #1,3相加的值是4  类的属性 打印学生的信息
stu1=student('susu','位置',18)
stu1.test(3,3) #3,3相加的值是6  类的属性 打印学生的信

 

posted @ 2019-11-05 10:49  槑槑DE  阅读(478)  评论(0编辑  收藏  举报