目录
何为类
类,顾名思义就是一种数据类型,具有自己的属性和方法。类是一种对象的集合,所以对象也是类的实例。
这么说可能很抽象且难以理解,在这里我们暂时将类理解为一种类型。举一个比较具体的例子,人就可以是一个类。正常的人类都有一双眼睛和两条腿,这可以理解为人类具有的属性,人类可以制造工具也可以用语言进行沟通,这属于人类的一种方法。
创建类
为了方便理解,首先我们先创造人这个类:
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