首页 > 编程语言 >Python面向对象(一):类的概念和使用

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

时间:2024-03-23 14:59:12浏览次数:30  
标签:__ 概念 Python gender self 面向对象 Bob age 属性

目录

何为类

创建类

为类创造一个实例

内部访问

内部隐藏


何为类

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

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

创建类

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

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,gender,self,面向对象,Bob,age,属性
From: https://blog.csdn.net/a4546565/article/details/136950656

相关文章

  • python 内置数据结构-数值型
    内置数值型数据结构int整数(int):在Python中,整数是没有小数部分的数字。整数可以是正数、负数或零。Python中的整数没有大小限制,取决于内存区域的大小,可以表示任意大小的整数。x=10y=-5z=0print(x,y,z)#输出:10-50float浮点数(float):浮点数是带有小数......
  • 我与python的故事(一)
    作者:长河落日(xiaobaixpython)我是个文科生,数学一般,从对python一无所知,到可以利用python办公自动化,爬取新闻、电影、音乐,自动回复微信,批量识别图片中文字、一键生成词云等,基本上可以满足工作需要。最重要的是,我获得了一种学习python的能力。其实python入门没有那么难,关键是要找......
  • Python常用模块(random随机模块&json序列化模块)
    1.random随机模块返回两数之间的随机数,不包括尾数:random.randrange()importrandomprint(random.randrange(1,10))#3返回两数之间的随机数,包括尾数:random.randint()importrandomprint(random.randint(1,10))#返回1-10之间的一个随机数,包括10#7随机选取0到100间......
  • 【Python小随笔】 SSH 获取信息
    importparamiko#获取信息defcheck_msg(hostname,username,password):#创建SSH客户端实例ssh_client=paramiko.SSHClient()ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh_client.connect(hostname,22,username,passwo......
  • 【华为OD】2024年C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
    2024年C卷真题题集题库,有2种分数的题目列表,分别是100分的列表、200分的列表需要订阅请看链接:C卷100分真题集质量分:94价格:39.9元C卷200分真题集质量分:94价格:99.9元从2023年11月开始,华为OD题目切换到C卷,基本上大概率会使用半年左右,要在2024年5月之前把这些题目都好好练习一下......
  • 第十四届蓝桥杯大赛软件赛省赛Python 《01串的熵》
    问题描述问题类型暴力,枚举、问题分析由例题知对于一个长度为L的01串,设0出现的次数为x,则1出现的次数为L-x,其信息熵整理后可表示为:基于此,我们可以给出当长度L=23333333的01串,其信息熵为11625907.5798时,该字符串中0和1的个数分别为多少。题目限制0出现的次数比1少,可以通过......
  • 八下物理概念
    八下物理概念在力的作用点下绕固定点转动的硬棒叫做杠杆该固定点叫做支点,促使杠杆转动的力F1叫做动力,阻碍杠杆转动的力F2叫做阻力,从支点到动力作用线的距离l1叫做动力臂,从支点到阻力作用线的距离l2叫做阻力臂使用杠杆时,如果杠杆静止不动或绕支点匀速转动,那么杠杆就处于平衡状......
  • 实现通过 Python 检查服务器的 443 端口是否接通
    实现通过Python检查服务器的443端口是否接通importsocketdefcheck_port(host,port):try:#创建socket对象s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#设置连接超时时间为3秒s.settimeout(3)#连接......
  • 9.python if 语句
    9.pythonif语句一般什么场景需要进行条件判断?用户权限判断:根据用户的权限级别来确定是否允许访问特定的功能或资源。表单验证:根据用户输入的信息验证表单的有效性,例如检查电子邮件地址是否合法、密码是否符合要求等。游戏逻辑:在游戏开发中,可能需要根据玩家的得分......
  • 网络工程师的Python之路-网络运维自动化实战-1.2
    1.2.2脚本模式在Windows里,有两种方法创建Python脚本,一种是将代码写进Windows记事本里,另一种是借助第三方编辑器。两种方法分别介绍如下。1.使用记事本创建Python脚本在桌面上新建一个记事本文件,将代码print('hello,world!')写入,如下图所示。然后将其另存为.p......