鱼C论坛

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

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

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

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

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

x
知识点:

一、组合

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


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

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

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

p = pool(1,11)


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

#输出结果
10
100


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

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

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


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

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

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


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

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

评分

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

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 19:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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