Python面向对象(一):类的概念和使用

目录

何为类

创建类

为类创造一个实例

内部访问

内部隐藏


何为类

类,顾名思义就是一种数据类型,具有自己的属性和方法。类是一种对象的集合,所以对象也是类的实例。

这么说可能很抽象且难以理解,在这里我们暂时将类理解为一种类型。举一个比较具体的例子,人就可以是一个类。正常的人类都有一双眼睛和两条腿,这可以理解为人类具有的属性,人类可以制造工具也可以用语言进行沟通,这属于人类的一种方法

创建类

为了方便理解,首先我们先创造人这个类:

class Human:                             #创建人这个类
    def __init__(self, age, gender):     #初始化方法
        self.age = age                   #定义人的属性:年龄和性别
        self.gender = gender

    def say_Hi(self):                    #定义打招呼的方法
        print("Hi, I'm a", self.gender,", and I'm", self.age, "years old!")

在这里我们给人这个类定义了age(年龄)和gender(性别)这两个属性,以及say_Hi这个方法。而第一种方法__init__()是一种类的初始化方法,当创建这个类之后就会自动调用该方法,用来初始化类的内部参数。__init__()中的第一个参数self是类内部的一个实例,指向对象本身。在调用函数时不必传入相应的参数。在类内定义的方法中,都需要self这个参数,否则无法关联到类的实例。

self这个参数其实是可以随意命名的,但鉴于其指向对象本身,习惯上将其命名为self。

为类创造一个实例

接下来为类创造一个实例,将类给具体化,在这里基于人这个类创造一个具有自己年龄和性别属性的人:

class Human:                             #创建人这个类
    def __init__(self, age, gender):     #初始化方法
        self.age = age                   #定义人的属性:年龄和性别
        self.gender = gender

    def say_Hi(self):                    #定义打招呼的方法
        print("Hi, I'm a", self.gender,", and I'm", self.age, "years old!")

Bob = Human(18, 'boy')                   #创造一个名为Bob的实例

在这里我们创造了一个名为Bob的实例,赋予他的年龄属性为18,性别属性为boy。self将年龄和性别属性关联到实例Bob上,因此不需要提供self的参数。

内部访问

用点号" . "来访问对象的属性和方法。下面对调用Bob的say_Hi方法以及对Bob的年龄数据进行访问。

class Human:                             #创建人这个类
    def __init__(self, age, gender):     #初始化方法
        self.age = age                   #定义人的属性:年龄和性别
        self.gender = gender

    def say_Hi(self):                    #定义打招呼的方法
        print("Hi, I'm a", self.gender,", and I'm", self.age, "years old!")

Bob = Human(18, 'boy')                   #创造一个名为Bob的实例
Bob.say_Hi()                             #调用say_Hi方法 
print(Bob.age)                           #访问Bob的年龄属性                                    

输出结果为: 

既然可以访问对象的属性,那么也就可以进行修改

Bob.age = 20             #将Bob的年龄修改为20岁
Bob.say_Hi()             

相应输出结果为:

内部隐藏

在上述情况下,在外部可以访问对象的内部属性。不过这样真的稳妥吗?其实在绝大多数情况下,编写程序的人是不希望对象的一些属性能够从外部被访问到的,即将一些方法和属性设定为私有的,这就好比刚刚创建的人这个类,有些人不希望自己的年龄能够轻松地被人知道,所以就需要将年龄这个属性设为私有的。

在Python中,将对象的方法或属性设为私有,需要将其名称前添加两个下划线( __ )。设为私有的方法和属性只能通过内部访问。在我们将刚才定义的类中,年龄属性设为私有,并增设两个方法:

class Human:                             #创建人这个类
    def __init__(self, __age, gender):   #初始化方法
        self.__age = __age               #定义人的属性:年龄和性别
        self.gender = gender

    def say_Hi(self):                    #定义打招呼的方法
        print("Hi, I'm a", self.gender,", and I'm", self.__age, "years old!")
    
    def __secret(self):                  #一个禁止从外部访问的秘密
        print("I've never had a girlfriend before!")

    def say_the_secret(self):            #从内部访问这个秘密
        self.__secret()

接下来我们尝试访问一下对象内部设为私密属性的方法和属性,首先访问年龄属性:

Bob = Human(18, 'Boy')  #创建实例
print(Bob.__age)        #访问年龄属性(程序员不希望在外部所访问的)

这时候就会出现错误,无法访问。

访问设为私密属性的方法也是一样。

Bob = Human(18, 'Boy')  #创建实例
Bob.__secret()          #从外部打听一下Bob的小秘密

结果:

 但是如果通过内部访问,就可以让他自己说出自己的秘密:

Bob = Human(18, 'Boy')  #创建实例
Bob.say_the_secret()    #让他自己说出自己的小秘密

输出结果为: 

这是一个悲伤的故事。不过仍然存在一种方法,可以直接从外部访问对象的内部属性和方法,尽管并不建议你去这么做。在类名称前面加一条下划线,后面直接加上设为私有的属性或方法:

Bob = Human(18, 'Boy')  #创建实例
Bob._Human__secret()    #用一些不好的手段打听Bob的小秘密
print(Bob._Human__age)  #年龄也顺便访问了吧

这样就能从外部访问到对象的内部属性和方法了:

总之,严格来说是没有办法阻止别人访问对象的私有属性和方法的。不过这种命名方式是在给使用代码的人发出一个信号:这些属性和信息是不希望被访问和修改的。

类还有很多其他用途,类可以进行继承产生子类,子类也可以进行重写,修改父类的方法。今天先更这么多,关于类的继承和重写,可以参照我的下一篇博客:

Python面向对象(二):类的继承和覆写-CSDN博客

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 17:24:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 17:24:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 17:24:03       82 阅读
  4. Python语言-面向对象

    2024-03-26 17:24:03       91 阅读

热门阅读

  1. VC++ class wizard介绍

    2024-03-26 17:24:03       34 阅读
  2. 每日一题:C语言经典例题之字符串的比较

    2024-03-26 17:24:03       41 阅读
  3. 高斯数据库[GaussDB]TPDSS下面执行批量脚本报错。

    2024-03-26 17:24:03       36 阅读
  4. js高阶数组练习题

    2024-03-26 17:24:03       38 阅读
  5. python,pytorch进入虚拟环境(linux)

    2024-03-26 17:24:03       37 阅读
  6. 我与计算机

    2024-03-26 17:24:03       36 阅读
  7. leetcode 518.零钱兑换 II

    2024-03-26 17:24:03       35 阅读
  8. CMake中的build type

    2024-03-26 17:24:03       37 阅读
  9. 胎牛血清在细胞培养中的关键作用与功效

    2024-03-26 17:24:03       34 阅读
  10. Qt获取电脑屏幕大小

    2024-03-26 17:24:03       35 阅读