嘿,小家伙儿

导航

class (类)

定义 class 

人类是一个对人的大统称,人类就是一个类。同样,如果推演到我们这个文件管理系统的背景,文件就是一个大类, 每个具体文件就是这个类下面的个体(每个人是人类下的个体)。

根据这样的逻辑,如果要生出来一个人,就得现有人类这个大概念,如果想创建一个文件,就要有文件这个大概念。 用 class File 来创建一个大概念(类),注意我们通常约定类的名字要首字母大写。 然后用 my_file = File() 来创建一个具体的文件。 每个具体的个体都带有这个类的基本属性,如 create_timename。就像每个人都会有人类这个类当中的性别,年龄一样。

class File:
    def __init__(self):
        self.name = "f1"
        self.create_time = "today"

my_file = File()
print(my_file.name)
print(my_file.create_time)

  

有了对类的基本理解,我们再具体说明一下Python中定义类的做法。比如这个 self 是啥意思? self 是作为类自己的一个索引,不管你在定义类的时候,想要获取这个类的什么属性或功能,都可以通过 self 来获取。 比如这个 File 类中,获取类自己的 create_time,就写成了 self.create_time。之后在说类的功能的时候, 也是通过 self 来在类内部调用的。

而这里的 __init__() 是什么呢?每当你进行一次 my_file = File() 这种操作的时候,把类给实例化的时候, File 类都会触发一次 __init__ 功能,所以这是一个功能,用于初始化一些设置。

有了这些属性,我们就能出了获取属性,也能修改属性的值

有了对类的基本理解,我们再具体说明一下Python中定义类的做法。比如这个 self 是啥意思? self 是作为类自己的一个索引,不管你在定义类的时候,想要获取这个类的什么属性或功能,都可以通过 self 来获取。 比如这个 File 类中,获取类自己的 create_time,就写成了 self.create_time。之后在说类的功能的时候, 也是通过 self 来在类内部调用的。

而这里的 __init__() 是什么呢?每当你进行一次 my_file = File() 这种操作的时候,把类给实例化的时候, File 类都会触发一次 __init__ 功能,所以这是一个功能,用于初始化一些设置。

有了这些属性,我们就能出了获取属性,也能修改属性的值

my_file.name = "new_name"
print(my_file.name)

  

class 的功能 

上面提到了,其实这个最基础的 __init__ 也是类的一个功能,那么就可以像函数功能教学 那样当成真正的功能来使用。比如在 __init__() 里加上传入参数。并且在初始化 File()的时候传入你要 __init__ 的参数。

class File:
    def __init__(self, name, create_time="today"):
        self.name = name
        self.create_time = create_time

my_file = File("my_file")
print(my_file.name)
print(my_file.create_time)

  除了 __init__() 这个功能,当然你还可以定义更多的功能,想象一下,作为一个文件类,他还能做什么? 比如重命名?上面我们已经通过直接修改实例的名字来重命名,现在我们发现其实重命名是文件操作的一种基本功能, 所以我们将重命名标准化成一个类的功能,让所有实例都能用上。

class File:
    def __init__(self, name, create_time="today"):
        self.name = name
        self.create_time = create_time
    
    def change_name(self, new_name):
        self.name = new_name

my_file = File("my_file")
# 调用实例中,类的功能
my_file.change_name("new_name") 
print(my_file.name)

  当然,类的功能也是可以有返回值的,比如我想定义一个获取文件信息的功能。类的功能定义,相比普通的函数定义, 除了多出了一个 self,其他的并没有多大区别,所以你可以参考我讲函数的那一节来学习。

class File:
    def __init__(self, name, create_time="today"):
        self.name = name
        self.create_time = create_time
    
    def get_info(self):
        return self.name + "is created at" + self.create_time

my_file = File("my_file")
print(my_file.get_info())

  

继承 

想象你就是开发Python语言的工程师,想象关于类,还可以更加偷懒吗? 比如我有定义文本文件和视频文件,如果分开定义两个类,我可以这样写:

class Video:
    def __init__(self, name, window_size=(1080, 720)):
        self.name = name
        self.window_size = window_size
        self.create_time = "today"

class Text:
    def __init__(self, name, language="zh-cn"):
        self.name = name
        self.language = language
        self.create_time = "today"

  不过你有没有发现,这两种文件,其实是有共性的,比如他们都有 name,说到这里,我突然意识到,其实他们还可以抽象出一个更底层的类, 也就是文件类。这个文件类包含了属于文件所具备的共同属性和功能。 我们可以通过继承的方式,将细分类嵌入到抽象类中,减少共有属性/功能的重复开发。

class File:
    def __init__(self, name, create_time="today"):
        self.name = name
        self.create_time = create_time
    
    def get_info(self):
        return self.name + "is created at" + self.create_time

class Video(File):  # 继承了 File 的属性和功能
    def __init__(self, name, window_size=(1080, 720)):
        # 将共用属性的设置导入 File 父类
        super().__init__(name=name, create_time="today") 
        self.window_size = window_size

class Text(File): # 继承了 File 的属性和功能
    def __init__(self, name, language="zh-cn"):
        # 将共用属性的设置导入 File 父类
        super().__init__(name=name, create_time="today") 
        self.language = language
    
    # 也可以在子类里复用父类功能
    def get_more_info(self):
        return self.get_info() + ", using language of " + self.language

v = Video("my_video")
t = Text("my_text")
print(v.get_info())     # 调用父类的功能
print(t.create_time)    # 调用父类的属性
print(t.language)       # 调用自己的属性
print(t.get_more_info()) # 调用自己加工父类的功能

  

私有属性和功能 

下面这一点内容,其实初学者并不要求掌握,有上面的理解,其实对于你在日常生活中,自己流畅地使用类,已经足够了。 我在这里稍微介绍一下为什么要有这些私有的东西,用法什么的,我不觉得在初学的时候会留下多少印象, 所有之后你们要用的时候自己再搜关键词就好。

我们先来看一下私有的用法吧,然后我再来对着介绍一下。

 

class File:
    def __init__(self):
        self.name = "f1"
        self.__deleted = False  # 我不让别人用这个变量
        self._type = "txt"      # 我不想别人使用这个变量
    
    def delete(self):
        self.__force_delete()
    
    def __force_delete(self):  # 我不让别人使用这个功能
        self.__deleted = True
        return True
        
    def _soft_delete(self):     # 我不想让别人使用这个功能
        self.__force_delete()   # 我自己可以在内部随便调用
        return True

f = File()
print(f._type)      # 可以拿到值,但是这个类的作者不想让你直接这样拿到
print(f._soft_delete())  # 可以调用,但是这个类的作者不想让你直接调用

# 接下来的两个实验都会报错
# f.__deleted
# f.__force_delete()

  

为什么会有上面的实验现象呢?其实这种私有属性的东西,通常是你为别人开发项目的时候才要考虑的。 有的属性或者功能,你不需要让别人知道,也不需要让别人调用,纯属自己开发时才会用到的一些东西, 所以就可以用私有化,强隐藏或者弱隐藏起来。

私有特点
_ 一个下划线开头 弱隐藏 不想让别人用 (别人在必要情况下还是可以用的)
__ 两个下划线开头 强隐藏 不让别人用

特殊方法 

你有可能会在其他Python教程中看到类的一些特殊方法,但是我还是上面那句话,对于初学者,这些特殊方法是不需要掌握的, 我在这里稍微介绍一下为什么要有这些特殊方法,以及比较常用的是那些,之后你们已经是Python高手的时候,要用的它们时候自己搜关键词就好。

定义含义
def __init__() 初始化实例
def __repr__() 字符串的“官方”表现形式
def __str__() 字符串的“非正式”值
def __iter__() 遍历某个序列
def __next__() 从迭代器中获取下一个值
...还有很多 ...

posted on 2021-11-02 22:08  嘿,小家伙儿  阅读(59)  评论(0)    收藏  举报