导言
学习一个事物,首先要弄清楚这个事物是什么,也就是关于一个事物的基本概念
在此基础上去理解事物里面的内在联系就基本学会了
基本概念
类
- 用来描述具有相同属性和方法的对象的集合
- 对象是类的实例
属性
- 定义一个类的时候,这个类里面有变量和函数
- 只不过我们为了区分在类里面的变量和在类外面的变量,就叫类里面的变量为类的属性
方法
- 就是一个函数
- 在类里面的函数就叫做类的方法
- 还有一些概念如实例变量、实例化、继承
- 这里就不罗列了
- 这里只需要对类有一个先导概念,知道它是啥就好了!!!
# 定义一个class
class Myson:
# 下面这三个变量就叫做Myson的属性
name1 = '张三'
name2 = '李四'
name3 = '王麻子'
# 在class里面定义的函数son()就是类的方法
def son(self):
print('我有三个儿子。')
实例变量
- 上面有形如name1 = '张三'的语句
- name1这个变量就是类的属性
- '张三'这个值就是实例,当实例,可以理解为实际的例子赋给变量之后,我们也可以叫name1为实例变量
- 这个过程就叫做实例化,小至一个属性,大至整个类的实例化
# 调用类
# 这里将类赋值给x,变量可以被赋值也可以赋一个对象给它
#可以观察到我这里调用类的时候加了括号,而我定义类的时候没加
# 调用不叫括号把这个类整体赋给x,加了括号表示把执行结果给x,大家可以编代码试试加不加括号的区别
x = Myson()
print(x.name1,x.name2,x.name3)
输出:('张三', '李四', '王麻子')
print(x.son())
输出:我有三个儿子。
- 可以看到,调用类里面的方法可以用点调用的方式
- 即在被赋予类对象的变量后面加个点写上属性名或者函数就可以调用了
- 需要强调的是写的是函数,不是函数名,也就是在函数名后面要加括号,为啥要加我在上面已经讲过了
类的构造方法
上面举的例子,让我们知道了一个类里面定义属性和方法
但是都只是在类里面定义,外面的变量想要传进里面怎么办呢?
创建一个函数的时候,可以通过函数的形式参数传到函数里面
而类里面单独用一个部分来实现这个传值的功能
一般称为类的构造方法,就是一个初始化函数
# 类的构造方法__init__()
# initial的缩写,前后用两个短横夹起来表示私有,啥是私有在下文讲
# 继续上面的例子
class Myson:
def __init__(self,n1,n2,n3):
self.name1 = n1
self.name2 = n2
self.name3 = n3
# 输入三个儿子的名字
x = Myson('张三','李四','王麻子')
print(x.name1,x.name2,x.name3)
# 看例子可以知道,其实类是借助__init__()函数将外部值传进类里面去了
输出:('张三', '李四', '王麻子')
self
目前为止,相信大家应该都明白类是个啥了
但是上面两个例子中总是有存在self
为啥要有,有点懵~
# 前面已经讲了通过__init__()来向类传进值
# 而类是拥有相同属性和方法的集合
# 类里面的方法怎么去调用类里面的属性值呢
# 答案是通过self
class Myson:
def __init__(self,n1,n2,n3):
self.name1 = n1
self.name2 = n2
self.name3 = n3
def son1(self):
print('我的大儿子叫'+self.name1)
def son2(self):
print('我的二儿子叫'+self.name2)
def son3(self):
print('我的三儿子叫'+self.name3)
# 输入三个儿子的名字
s = Myson('张三','李四','王麻子')
s.son1()
s.son2()
s.son3()
输出:
我的大儿子叫张三
我的二儿子叫李四
我的三儿子叫王麻子
结合上面的例子我们来说一下
self的意思就是自己,也就是指的类本身,就像我们大家说我们自己一样ourselves
__init__()是来传递参数的,参数传给谁,不像单独一个函数一样是传给自己的,不用去指定
而一个类里面那么多方法必须要去指定
而且不是直接传给方法的,是传给类的属性的
所以形如self.name1 = n1
意思是说类自己有一个叫name1的属性,将外面的参数,也可以叫实例,传给它就好
然后类里面的方法里面都有个self,意思是指定类本身,也没其他的可以指定了
方法就可以通过这样的方式去使用类里面的属性,最开始就讲过类里面的属性是共同拥有的
总结一下
实例传给属性,方法按需使用属性
类的特殊属性和方法
类的私有属性
-
__sishengzi,由两个下划线开头意味着声明该属性为私有属性
# 接着上面的例子,除了三个儿子外,还有一个sishegzi,是不能说出来的
class Myson:
def __init__(self,n1,n2,n3,sishengzi):
self.name1 = n1
self.name2 = n2
self.name3 = n3
self.__sishengzi = sishengzi
def son1(self):
print('我的大儿子叫'+self.name1)
def son2(self):
print('我的二儿子叫'+self.name2)
def son3(self):
print('我的三儿子叫'+self.name3)
print('我的私生子叫'+self.name4)
# 输入三个儿子的名字加一个私生子的名字
s = Myson('张三','李四','王麻子','大宝')
s.son3()
# 运行的时候会报错,因为私有属性不能直接使用
输出:
我的三儿子叫王麻子
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-98-bd3378725830> in <module>
----> 1 s.son3()
2 # 运行的时候会报错,因为私有属性不能直接使用
<ipython-input-96-6442b5101d81> in son3(self)
12 def son3(self):
13 print('我的三儿子叫'+self.name3)
---> 14 print('我的私生子叫'+self.name4)
AttributeError: 'Myson' object has no attribute 'name4'
s.__sishengzi
# 运行的时候也会报错,因为私有属性也不能在类的外部使用
输出:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-99-a48dcc81edd2> in <module>
----> 1 s.__sishengzi
2 # 运行的时候也会报错,因为私有属性也不能在类的外部使用
AttributeError: 'Myson' object has no attribute '__sishengzi'
类的私有方法
- __sishengzi(),由两个下划线开头意味着声明该属性为私有方法
class Myson:
def __init__(self,n1,n2,n3,n4):
self.name1 = n1
self.name2 = n2
self.name3 = n3
self.name4 = n4
def son1(self):
print('我的大儿子叫'+self.name1)
def son2(self):
print('我的二儿子叫'+self.name2)
def son3(self):
print('我的三儿子叫'+self.name3)
def sishengzi(self):
print('我的没有私生子')
'''
这里的方法是私有的,但是类里面的其他方法可以使用/
大家可以将类想象成古代的一个大家族,大家族里面有很多帮助家族里面的成员修炼的物品/
这个大家族就是类/
物品就是类的属性/
成员就是方法/
物品任何成员都可以按需取取用/
类比方法可以按需取使用属性/
至于私有属性可以理解为大家族的不外传秘宝,只能供家族成员使用,而且还需要相关的要求/
私有方法可以理解为家族成员的丑闻,对于成员自身是不想外传的,但是总有些成员和他不对头/
让丑闻外传,类比这里的__sishengzi()函数是不能直接调用的,但是另一个方法sishengzi()/
调用了__sishengzi(),让私生子的名字传到了类的外面。
'''
self.__sishengzi()
def __sishengzi(self):
print('我的私生子叫'+self.name4)
# 输入三个儿子的名字加一个私生子的名字
s = Myson('张三','李四','王麻子','大宝')
s.son1()
s.son2()
s.son3()
输出:
我的大儿子叫张三
我的二儿子叫李四
我的三儿子叫王麻子
s.sishengzi()
s.__sishengzi()
输出:
我的没有私生子
我的私生子叫大宝---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-103-a61652d47f13> in <module>
1 s.sishengzi();
----> 2 s.__sishengzi();
AttributeError: 'Myson' object has no attribute '__sishengzi'
总结一下
私有的属性不能在外部直接使用,在类内部使用的时候也需要借助一定的方法,至于是啥方法,留给大家去查找
私有的函数不能再外部使用,但可以在内部被其他方法调用。
关于类的**继承**和**方法重写**,这里就不去介绍了,因为懂了以上的内容,写一个类和看懂一个别人写的不那么复杂的类是没问题的,继承和方法重写一般一个团体开发一个项目多次进行项目的更新和迭代才用得上。大伙想进一步深入可以去看看其他大佬博主写的教程哦~