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博客

  • 49
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值