python基础学习-组合+类、类对象和实例对象+绑定

这一部分主要记录之前学这一块遗漏的一些东西

1、组合

在这里插入图片描述
这里如果用多继承的话,用水池继承乌龟和鱼,涉及到了不同物种,显然不太合适,这里就引入了组合的概念。

# 组合(将需要的类一起进行实例化并放入新的类中)
# 现在要求定义一个类,叫水池,水池里要有乌龟和鱼。
class Turtle:
    def __init__(self,x):
        self.num = x

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

class Pool:
    def __init__(self,x,y):
        self.turtle = Turtle(x)
        self.fish = Fish(y)

    def print_num(self):
        print('水池里一共有乌龟 %d 条,鱼 %d 条' % (self.turtle.num, self.fish.num)) # self.turtle是Turtle实例化后的对象

pool = Pool(1, 10)
pool.print_num()

运行结果
在这里插入图片描述
组合一般是把几个没有继承关系的几个类放在一起,就叫做组合(一般横向关系的几个类叫做组合,纵向关系的几个类叫做继承)。

2、类、类对象和实例对象

修改类对象的属性不会修改实例对象的属性
首先看一个例子

# 类、类对象和实例对象
class C:
  count = 0

a = C()
b = C()
c = C()

print("a,b,c实例化C后的count值为", a.count ,b.count, c.count)

# 修改实例化对象的属性
c.count += 10
print("实例化对象c.count做加法后a,b,c的值", a.count ,b.count, c.count)
# 修改类对象的属性
print("C类对象的count值", C.count)
C.count += 100
print("类对象C.count做加法后a,b,c的值", a.count ,b.count, c.count)

运行结果
在这里插入图片描述
对比上面的结果,可以发现对实例对象c的count属性赋值后,就相当于覆盖了类对象C的count属性。如果没有赋值覆盖,那么引用的是类对象的count属性。
在这里插入图片描述
类中定义的属性其实都是静态属性,对实例化对象的c的count进行修改时,并不会影响到类对象C的属性

如果属性的名字跟方法名相同,属性会覆盖方法

# 类、类对象和实例对象,如果属性的名字跟方法名相同,属性会覆盖方法
class C:
  def x(self):
    print("x方法")

c = C()
c.x()

# 给实例化属性赋值后,如果属性的名字跟方法名相同,属性会覆盖方法
c.x = 1
c.x() # 无法正常调用x方法

这里在给实例化对象c的属性x赋值之后,这里的x属性将会覆盖x方法,调用c.x() 将会报错
在这里插入图片描述
小总结:不要试图在一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展;用不同的词性命名,如属性名用名词、方法名用动词,并使用骆驼命名法等。

3、绑定

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里因为类对象定义的属性相当于静态变量,就算类对象被删除了,他们依然存储在内存当中,只有当程序退出后,内存才会被释放。在平常开发中,我们尽量使用实例对象的属性,减少使用类对象相关的操作(类对象属性相关操作一般用来跟踪与类有关的值)

Guess you like

Origin blog.csdn.net/m0_47146037/article/details/120768405