类的定义
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
举个生活栗子,一个公司可以看作一个类,公司下的部门,可以方法,公司有很多不同级别的领导,可以看作是属性,部门可以有很多,领导可以是BOSS,也可以是小部门的领导。所以一个类下面可以有多个方法和多个属性,属性可以只属于某个方法,也可以是全局的。
类的创建
python3创建类的方式有两种,一种带括号,一种不带括号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class
Test:
def __init__(self,x):
self.x = x
def outprint(self):
return
self.x
class
Test2:
def __init__(self,x):
self.x = x
def outprint(self):
return
self.x
class
Test3(
object
):
def __init__(self,x):
self.x = x
def outprint(self):
return
self.x
a = Test
b = Test2
c = Test3
print(a)
print(b)
print(c)
print(a(1))
print(b(1))
print(c(1))
|
运行结果:
1
2
3
4
5
6
|
<
class
'__main__.Test'
>
<
class
'__main__.Test2'
>
<
class
'__main__.Test3'
>
<__main__.Test
object
at 0x000001A6A7E88668>
<__main__.Test2
object
at 0x000001A6A7E88668>
<__main__.Test3
object
at 0x000001A6A7E88668>
|
结论:由此可见,python3创建类的时候,可以不带括号,也可以带,也可以显示继承object,如果带个()空括号,其实也是隐士的继承了object。这三种方式是相等的。
赋值
上面已经讲了类的创建,在讲类的实例化之前,先说一下赋值。
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
等号(=)用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:
1
2
3
4
|
a = None
print(id(a))
print(id(None))
print(a == None)
|
运行结果:
1
2
3
|
1625859280
1625859280
True
|
结论:可以看出,a赋值了None后,a 与None指向同一个内存地址,并且值也相等,所以a == None 是True。
我之前讲过,python对象三个基本要素:id,value,type。id是对象的唯一标识,value对象的值,type标识对象的类型。所有变量即对象。
上面a is None的话,就是通过id来判断,如果是a == None的话,就是通过value来判断。
类的实例化
上面赋值我们用的是“等号”,是针对变量的。其实在讲类的创建,也用了“=”号来赋值。
什么是实例化? “类提供默认行为,是实例的工厂”,打个比方,车是类,别克凯越是类的实例。
类的实例化只有一种方式,就是实例化的时候,需要带括号,这个括号根据实际情况可以为空,也可以传参。看例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
class
Test:
def __init__(self,x):
self.x = x
def outprint(self):
return
self.x
class
Test_1(
object
):
def __init__(self,x):
self.x = x
def outprint(self):
return
self.x
# 给类起一个别名
a = Test
# 实例化类
b = Test(1)
# 实例化类
c = Test_1
print(a)
print(a == Test)
print(b)
print(Test(1))
print(id(b))
print(id(Test(1)))
print(b == Test(1))
print(c)
# 赋值
d = a
print(id(Test))
print(id(a))
print(id(d))
print(a == d)
# 获取当前类的属性列表
print(dir(a))
print(dir(c))
|
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<
class
'__main__.Test'
>
True
<__main__.Test
object
at 0x00000168B1458630>
<__main__.Test
object
at 0x00000168B1458668>
1549162350128
1549162350576
False
<
class
'__main__.Test_1'
>
1549339665432
1549339665432
1549339665432
True
[
'__class__'
,
'__delattr__'
,
'__dict__'
,
'__dir__'
,
'__doc__'
,
'__eq__'
,
'__format__'
,
'__ge__'
,
'__getattribute__'
,
'__gt__'
,
'__hash__'
,
'__init__'
,
'__init_subclass__'
,
'__le__'
,
'__lt__'
,
'__module__'
,
'__ne__'
,
'__new__'
,
'__reduce__'
,
'__reduce_ex__'
,
'__repr__'
,
'__setattr__'
,
'__sizeof__'
,
'__str__'
,
'__subclasshook__'
,
'__weakref__'
,
'outprint'
]
[
'__class__'
,
'__delattr__'
,
'__dict__'
,
'__dir__'
,
'__doc__'
,
'__eq__'
,
'__format__'
,
'__ge__'
,
'__getattribute__'
,
'__gt__'
,
'__hash__'
,
'__init__'
,
'__init_subclass__'
,
'__le__'
,
'__lt__'
,
'__module__'
,
'__ne__'
,
'__new__'
,
'__reduce__'
,
'__reduce_ex__'
,
'__repr__'
,
'__setattr__'
,
'__sizeof__'
,
'__str__'
,
'__subclasshook__'
,
'__weakref__'
,
'outprint'
]
Process finished with exit code 0
|
结论:我把前面的例子也写进来了,就是方便理解,有点多,但要耐心点看。
上面的结果告诉我们:python的类,带括号是实例化,不带括号是赋值。(记住这个)
总结
以上内容是一个简单的知识点,小知识点容易被忽略,不清楚的可以再复习一次。