01 类定义

封装继承和多态

封装:类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象

属性:变量在类中称为属性,但是类中的属性不仅仅只包含变量,函数等其他的对象也可以作为类的属性

1,“类”与“实例”之间的关系

:是一类事物的抽象,不是真实存在的。用来描绘该类事物的共性。
例如:“人”、“动物”、“家具”。是一个独立存放变量(属性/方法)的空间。

实例:某类事物的具体个体,是该类事物的具体表现,它是真实存在的。也是一个独立存放变量的空间
例如:“句号”是具体的某个“人”,“加菲猫”是具体的某个“动物”。

一个“实例”的“特征”,就是“属性”。在python中有两种私有属性,分别是在属性前加 一个下换线(_) 和 两个下划线__._和 __ 的使用 更多的是一种规范/约定,没有真正限制的目的,定义在类中的私有属性也可以被子类继承。

2,定义

定义:类的定义使用关键字 class

class Cat: #大驼峰命名法,每个单词的首字母大写
   """
    这是一个猫类
   """
pass
#实例化对象
kitty = Cat()
hua = Cat()

属性

属性:color,eat就是对象的属性

#通过句点法给实例赋值
kitty.color = 'white'
kitty.eat = 'milk'
hua.color = 'colorful'
hua.eat = 'fish'

实例属性 : 记录的是每一个实例的特征

class Cat:
    '''
这是一个猫类'''

    def __init__(self,color,eat):
        self.color = color   
        self.eat = eat

kitty = Cat("white","milk")
hua = Cat("color","fish")

print(kitty.color)

类属性:记录的是与类相关的特征

class Cat:
    '''这是一个猫类'''
    count = 0   #类属性,记录你实例化对象的次数
    def __init__(self,color,eat):
        self.color = color   
        self.eat = eat
        Cat.count += 1 #类名.类属性名

kitty = Cat("white","milk")
hua = Cat("color","fish")
lucky = Cat("black",'food')

#类属性外部调用
print("现在创建了{}只猫".format(Cat.count))    #外部调用1:类名.类属性名
print(kitty.color)  #外部调用2:实例名.类属性名
print(kitty.count)  #实例调用实例属性
# print(Cat.color)   #报错,类不能调用实例属性

私有属性 :单下划线开头:告诉别人这是私有属性,依然可以使用。双下划线开头:不可以使用

class Cat:
      def __init__(self,color,eat,age):
          self.color = color
          self._eat = eat
          self.__age = age

kitty = Cat("white","milk",5)
print(kitty.color)
print(kitty._eat)
# print(kitty.__age)   #报错

02 方法

方法:和某个特定的类相关联的函数

# 函数转为方法
class Cat:
    """
这是一个猫类
"""

    # def __init__(self,color,eat,age):
    #     self.color = color
    #     self.age = age
    #     self.eat = eat

    def add_cat(self):
        print("{}-{}".format(self.color, self.age))


kitty = Cat()
kitty.color = "white"
kitty.age = 3

# 函数调用1:方法本身就是一个函数
Cat.add_cat(kitty)  # 类名.方法名
# 函数调用2
kitty.add_cat()
# self:传入的是创建的对象,self可以直接将对象的属性传入方法中
# 这种在对象中封装数据,对类进行优化的方法就叫做“封装”

1,类的私有方法

class Cat:
    """这是一个猫类"""
    count = 0

    def __init__(self, color, eat, name):
        self.name = name  # 实例属性
        self._color = color  # 外部可以访问的私有属性
        self.__eat = eat  # 外部不可以访问的私有属性
        Cat.count += 1  # 内部使用

    def add_cat(self):
        print("{}-{}-{}".format(self._color, self.name, self.__eat))
        # print(self.__print_cat())  

    # 私有方法
    def __print_cat(self):
        return "我是私有方法"

#实例化对象
kitty = Cat("white", "milk", "kitty")
print(kitty.name)
print(Cat.count)
# print(kitty.__eat)
print(kitty._color)
#调用
Cat.add_cat(kitty)  # white-kitty-milk
kitty.add_cat()  # white-kitty-milk

# Cat.__print_cat(kitty)  # 报错,原因:私有方法不可以被实例和类直接调用
# kitty.__print_cat()

改进:私有方法虽然无法被实例和类直接调用,但可以通过内部的方法来操作:如下面的例子,通过调用Cat.add_cat(kitty)或kitty.add_cat()的调用可以打印出 “我是私有方法”

def add_cat(self):
        print("{}-{}-{}".format(self._color, self.name, self.__eat))
        print(self.__print_cat())

03 初始化和析构(待补充)