鱼C论坛

 找回密码
 立即注册
查看: 1888|回复: 0

[技术交流] 37 类和对象:拾遗 - 景命

[复制链接]
发表于 2017-8-24 22:40:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
知识点:

一、组合

        有些时候用继承也不是,用多继承也不是。这个时候我们就用到了组合。
        所谓的组合就是把类的实例化放到一个新的类中,那么新类就把旧类组合进去了。一般是类于类之间的横向关系。
        组合一般是把几个没有继承关系的没有直接关系的几个类放到一起。


例)要求定义一个水池类,水池中要有乌龟和鱼。
#如果用水池类继承乌龟和鱼类那么会不太合适,因为水池中有鱼和乌龟,但是水池鱼乌龟和鱼没有共同点
  1. class Tortoise:
  2.     def __init__(self,x):
  3.         self.num = x

  4. class Fish:
  5.     def __init__(self,y):
  6.         self.num = y

  7. class pool:
  8.     def __init__(self,x,y):
  9.         self.tortoise = Tortoise(x)        #Tortoise(x)返回的是Tortoise类的实例对象,所以self.x是一个Tortoise类的实例对象。
  10.         self.fish = Fish(y)
  11.         print("一共有乌龟%d只,小鱼%d条。" %(self.tortoise.num,self.fish.num)) #用Tortoise类的实例对象去调用参数num。

  12. p = pool(1,11)
复制代码



二、类、类对象、实例对象

  1. class A:
  2.     count = 0
  3. a = A()
  4. b = A()
  5. c = A()
  6. a.count += 10                #此时改变的并不是类A中的count,而是实例对象a的count,可以理解为创建了新的属性count。
  7. A.count = 100                #在这里改变类A的count,实例对象a中的count不会改变,因为不是一个count。
  8. print(a.count)
  9. print(b.count)

  10. #输出结果
  11. 10
  12. 100
复制代码



三、属性名和类中的方法名相同问题:
例)
  1. class c:
  2.     def x(self):
  3.         print("sss")
  4. a = c()
  5. a.x = 3        #意思是创建属性x并赋值为3。此时创建的属性名和类中方法名相同。
  6. a.x()

  7. #输出结果会报错
  8. Traceback (most recent call last):
  9.   File "E:/Python/第039讲.类和对象:拾遗/实验.py", line 43, in <module>
  10.     a.x()
  11. TypeError: 'int' object is not callable
复制代码


所以为了避免名字上的冲突,大家应该遵守一些约定俗称的规矩。
例如:
        不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展。
        用不同的词性命名,如属性名用用词,方法名用动词。


四、到底什么是绑定
Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。
  1. class a:
  2.     def printaa():                #参数没有self,表示不绑定实例对象。
  3.         print("no zuo no die")

  4. a.printaa()                        #在这里可以用类去直接访问方法。
  5. x = a()                                #但是在这里实例化之后访问方法会报错
  6. x.printaa()                        #实际上相当于 x.print(x),但是方法定义的时候没有self,所以报错。

  7. #输出结果
  8. no zuo no die                        #类对象直接访问的结果
  9. Traceback (most recent call last):
  10.   File "E:/Python/第039讲.类和对象:拾遗/实验.py", line 40, in <module>
  11.     x.printaa()
  12. TypeError: printaa() takes 0 positional arguments but 1 was given
复制代码



五、__dict__()方法
#用来查看对象的属性和属性对应的值,返回值为字典类型。字典中仅有实例对象的属性,不显示类属性和特殊属性(也就是没有魔法方法)。
        返回值:字典,键为属性名,值为属性对应的值。
  1. class CC:
  2.     def setXY(self,x,y):
  3.         self.x = x
  4.         self.y = y
  5.     def printXY(self):
  6.         print(self.x,self.y)

  7. d = CC()
  8. print(CC.__dict__)                #查看类对象CC有哪些属性。
  9. d.setXY(1,2)
  10. print(d.__dict__)                #查看实例对象d有哪些属性。
  11. del CC                                #此时删除类对象CC
  12. d.printXY()                        #实例对象d依然可以调用类中方法,因为删除的只是类对象,类却还在。
复制代码

评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 11:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表