程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

初学者python笔记(静态属性、类方法、静态方法、类的组合)

发布于2020-03-15 18:05     阅读(1474)     评论(0)     点赞(1)     收藏(3)



本篇文章是上一篇:初学者python笔记(面向对象编程、类与对象)的后续篇,是关于Python中面向对象编程的更深入分析,主要总结了类的三大方法:静态属性、类方法、类的组合方面的重点知识

类的三大方法

Ps:请先看案例,后文有对三大方法的分类总结

1、静态属性
class Room:
    def __init__(self,name,owner,width,length,heigh):
        self.name= name
        self.owner= owner
        self.width= width
        self.length= length
        self.heigh= heigh

    #计算体积的一个方法
    @property   #绑定实例的方法(把整个类当做一个装饰器),property操作相当于把函数属性变成了数据属性
    def cal_area(self):
        print('%s的房间的体积为:' %self.owner, self.width * self.length * self.heigh)
        
#实例化
v = Room('卧室','Ross',50,50,30)  #传入self的参数
v2 = Room('浴室','山治',2,2,3)

#调用对象,因为被变成了数据属性(静态属性),就不需要加括号运行了
#v.cal_area()
#v2.cal_area()
v.cal_area
v2.cal_area

运行结果:
静态属性

2、类方法、静态方法
class Room:
    tag = 'in Room'
    def __init__(self,name,owner,width,length,heigh):
        self.name= name
        self.owner= owner
        self.width= width
        self.length= length
        self.heigh= heigh

    def pr_info(self):
        print(self.tag)

    @classmethod  #一个专门供类使用的方法(类方法),可以不通过实例,只执行类的方法
    def pr_infomation(cls,x):  #必要参数cls,但不需要再传入self了,因为类中包含了self
        print(cls)  #打印pr_infomation方法所在的类
        print(cls.tag)  #这样就可以单独调用类的方法
        print(x)  #外部传入的形参x

    @staticmethod  #声明定义一个静态方法,不绑定cls也不绑定self
    def eat_food(a,b,c):
        print('{} {} {}正在吃饭'.format(a,b,c))
        #因为没有绑定类,也没有绑定实例,故不能运行cls和self的属性
        #print('%s,%s来自静态方法' %(self.name,self.owner))
    
#实例化
'''v = Room('卧室','Ross',50,50,30)  #传入参数
v2 = Room('浴室','山治',2,2,3)
#调用对象,说明self是可以调用类中定义的数据属性的
v.pr_infomation()
v2.pr_infomation()'''

#类方法,可以传入参数,可以使用类属性
Room.pr_infomation('1')  #执行类中的方法,但不实例化,只能访问类的属性
Room.pr_infomation('带参类方法')  #传入参数的类方法

#静态方法,只能使用传入的参数
Room.eat_food('路飞','索隆','山治')  #用类来调用静态方法
vv = Room('浴室','山治',2,2,3)  
vv.eat_food('路飞','索隆','山治')  #用实例来调用静态方法方法,同样可行

运行结果:
类方法、静态方法

3、三大方法总结

静态属性(property): 实例属性和类属性都可以访问(属性都能用,但不能传入参数

类方法(classmethod): 只访问类属性,不能访问实例的属性(类属性能用,传入参数也能用

静态方法: 不能访问类属性,也不能访问实例属性(只能使用函数调用时传入的参数

类的组合

1、用法分析
class Head:
    pass

class Hand:
    pass

class Foot:
    pass

class Trunk:
    pass

class Body:
    def __init__(self,name,id_num):
        self.name= name
        self.id_num= id_num
        #用另外一个类来当属性,就称为类的组合
        self.head= Head()
        self.hand= Hand()
        self.foot= Foot()
        self.trunk= Trunk()

#实例化
p1 = Body('1234556789','乌索普')
print(p1.__dict__)  #另外的类也包括在Body类的属性里面了

运行结果:
代码分析

2、面试案例分析
#公司类
class Company:
    def __init__(self,name,location):  #公司名字,公司位置
        self.name= name
        self.location= location

    def hr_interview(self):  #面试的动作
        print('%s 正在开展面试' %self.name)

#职位类
class Position:
    def __init__(self,name,salary,period,company):  #4个形参
        self.name= name
        self.salary= salary
        self.period= period
        self.company= company

#实例化,存放不同公司的对象
v1 = Company('迪达拉','北京')
v2 = Company('极界','南京')
v3 = Company('木心丸','东京')
v4 = Company('串串香','西京')

vv = Position('熊二',10000,6,v1)  #最后一个参数传入一个对象,表示公司

#调用对象
vv.company.hr_interview()  #输出组合后的结果,直接调用对象

#让用户实现选择:
#直接输出的语句,表示提示用户可供的选择
print("1-->迪达拉,北京\n2-->极界,南京\n3-->木心丸,东京\n4-->串串香,西京")

while True:
    menu = {
        '1':v1,
        '2':v2,
        '3':v3,
    }
    choice = input('请选择公司>>>')
    com_obj = menu[choice]  #让用户输入的当做键来匹配对应的值,即那几个公司信息

    choice2 = input('请选择职位名>>>')
    choice3 = input('请选择薪资>>>')
    choice4 = input('请选择周期>>>')
    
    new_pt = Position(choice2,choice3,choice4,com_obj)  #创建一个职位的对象

    #输出对应的信息,通过类的属性来输出(包括组合属性)
    print('{}公司位置在{}\n您应聘的职位是{},薪资{},周期{}'.format(new_pt.company.name,
            new_pt.company.location, new_pt.name, new_pt.salary, new_pt.period))

运行结果:
应聘系统案例
什么时候用类的组合呢?
就是当类之间有显著不同,并且较小的类是较大的类所需要的组件时。
另外,还有类的继承与多态,与类的组合不同的另一个概念,将在后续文章进行总结



所属网站分类: 技术文章 > 博客

作者:老铁哪来的

链接:https://www.pythonheidong.com/blog/article/259925/b8a48c8fefb8565645c8/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)