python面向对象之静态属性/静态方法/类方法/组合
Posted FHBIAO
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python面向对象之静态属性/静态方法/类方法/组合相关的知识,希望对你有一定的参考价值。
#!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self.Name = name self.Addr = addr self.Type = type def details(self): print("学样的详细信息, 名称:%s 地址:%s 类型:%s" %(self.Name,self.Addr,self.Type) ) c1 = Campus("南京大学","江苏南京","985") print(c1.__dict__) print(Campus.__dict__) # 注意实例字典与类的字典的区别 c1.details() Campus.details(c1) # 使用类去调用方法时,需要传入具体的实例参数 #### 也推荐看看廖雪峰的教程: https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457 ##### class Room: clr = \'可选的,默认白色\' def __init__(self,name,owner,width,length,height): self.name = name self.owner = owner self.width = width self.length = length self.height = height def area(self): return self.width * self.length @property # 此装饰器就是负责把一个方法变成静态属性调用 def space(self): return self.width * self.length * self.height @classmethod # 供类使用的方法,虽然实例也可以调用 def colour(cls): # 此 cls 表示自动传递类名作为参数 print("房间的色彩是",cls.clr) @staticmethod # 比喻为类的工具包. 只是名义上的归属类管理,不能使用类变量和实例变量 def round(a,b): print("地板使用%s或%s"%(a,b)) ## 静态属性既可以访问实例属性,又可以访问类的属性 ## 类方法 不能访问到实例的属性 ## 静态方法 不能访问类的属性,也不能访问实例的属性 # self跟实例绑定, cls跟类绑定, @staticmethod 跟谁都不绑定 r1 = Room(\'公寓\',\'alex\',9,9,2) r2 = Room(\'house\',\'jerry\',12,13,5) print(r1.area()) print(r2.area()) print("空间:",r1.space) # 调用方法不一样了,省掉括号 print("空间:",r2.space) # @property的好处是封装一个属性, 使用时完全感知不到背后的逻辑 Room.colour() # 跟实例没有关系,只是类调用自己的函数. 类级别的操作. Room.round(\'木板\',\'瓷砖\') r1.round("牛皮","水泥") # 类或实例都可以调用 ## 学着学着感觉到累了, 就去B站找了下以前喜欢的视频: ## 砖家 "你不知道的西游记" https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457 ## 这个系列的解说真是精彩, 以前在UKu上看过, 强力推荐给刚入社会的年轻人们看看.
组合:
#!/usr/bin/env python # coding:utf-8 # class Hand: # pass # # # class Foot: # pass # # # # class Trunk: # pass # # # class Head: # pass # # # class Person: # def __init__(self, id_num, name): # self.id_num = id_num # self.name = name # self.hand = Hand() # 使用小类的实例化 # self.foot = Foot() # self.trunk = Trunk() # self.head = Head() # # # p1 = Person(\'111111\', \'alex\') # print(p1.__dict__) # ## 类的组合:组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 # ## 参考: http://www.cnblogs.com/linhaifeng/articles/7340153.html class School: def __init__(self,name,addr): self.name = name self.addr = addr class Course: def __init__(self,name,price,period,school): self.name = name self.price = price self.period = period self.school = school class Teacher: def __init__(self,name,age,gender,): self.name = name self.age = age self.gender = gender s1 = School("Mooc",\'北京\') s2 = School("Mooc",\'上海\') s3 = School("Mooc",\'线上\') msg = \'\'\' 1 xx学院 新校区 2 xx学院 老校区 3 xx学院 网络校区 \'\'\' while True: print(msg) menu={ \'1\':s1, \'2\':s2, \'3\':s3 } choice = input("选择学校:") school_obj = menu[choice] n_name = input("课程名:") n_price = input("课程价格:") n_period = input("课程周期:") new_course= Course(n_name,n_price,n_period,school_obj) print("课程[%s]属于[%s]学校,费用[%s]" %(new_course.name,new_course.school.name,new_course.price))
虽然这些都是小练习,与实际生产还有很大差距,但是没有这些练习的熟练掌握,怎么能玩转实际生产呢?
继续!
抽象类与接口练习:
#!/usr/bin/env python # coding:utf-8 import abc #利用abc模块实现抽象类(没错,就叫abc) class All_file(metaclass=abc.ABCMeta): # 定义成基类 @abc.abstractmethod # 用装饰器的方式定义抽象方法,无需实现功能 def read(self): pass # 基类方法不用实现 子类必须定义功能 @abc.abstractmethod def write(self): pass ## 接口继承:就是定义了一个父类,规定了所有的子类必须实现父类的方法,但是父类不实现。并不是为了节省代码 ## 子类继承时必须实现具体地实现基类规定的方法,不实现就办法实例化 class Disk(All_file): def read(self): print("disk read") def write(self): print("disk write") class Mem(All_file): def read(self): print("mem read") def write(self): print("mem write") class cdrom(All_file): def read(self): print("cd read") def write(self): print("burn cd") cd1 = cdrom() # 如果 cdrom没有去实现write方法,实例化时就会报错 \'\'\' 参考: http://www.cnblogs.com/linhaifeng/articles/7340153.html 抽象类与接口 抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。 抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计 \'\'\'
以上是关于python面向对象之静态属性/静态方法/类方法/组合的主要内容,如果未能解决你的问题,请参考以下文章