首先让我们先了解一下面向对象的概念(因为python是面向对象的一门语言):
在人类认知中,会根据属性相近把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都在鸟类的原型基础上的。面向对象就是模拟了以上人类认知过程。在Python语言,为了听起来酷,我们把上面说的“东西”称为对象(object)。
上述中引申出两个概念:类和对象
--类:用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法
(所谓的属性就是具有那些共有的特征,拿人类举个例子:名字、体重、身高、肤色、性别等等;所谓的方法就是具体的行为,还是拿人类举个例子:吃饭、睡觉、繁殖)
(在实际的开发过程中,我们只需要将我们所关心的属性和方法提取出来)
--对象:就是将我们抽象出来的类进行一个填充,比如说我们关心的人类属性有(名称、性别)人类具体行为(吃饭、睡觉),我们怎么填充呢?就是针对这里括号里面的内容的一个具体的描述
例如:属性(老王、男)这个时候我们就一个具体的对象描述出来了
那我们怎么用python语言将类和对象进行描述出来呢?【进入正题】
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
# 使用class来进行一个类的定义(类名一般大写开头单词)
class Person(object):
#__init__ 是构造函数 也就是创建对象的时候 构造一个对象的方法,注意__init__方法第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。
def __init__(self, name, sex):
self.name = name # 绑定name具体的值到实例本身
self.sex = sex # 绑定sex具体的值到实例本身
#要定义一个实例方法,只要第一个参数传入self,其他和定义普通的函数没有什么区别
def eat(self):
print("i'm eating")
def sleep(self):
print("i'm sleeping")
"""
上边就是一个简单类的定义过程
实际开发过程中只需要将我们所需要的内容定义出来,因为我们并不能将我们想要描述的一类内容的全部属性和方法全部穷举出来
"""
"""
那么类中到底有哪些内容呢?
>>>>>>
类变量(类中所有方法之外的变量统称为类变量)
实例变量(__init__构造函数中定义的变量)
局部变量(类方法、静态方法、实例方法等方法中定义的变量)
<<<<<<
>>>>>>
类方法(本文不涉及,后续会有文章具体的概述)
实例方法(也就是那些传递第一个参数为self的函数)
静态方法(本文不涉及,后续会有文章具体的概述)
<<<<<<
"""
好了 我们的简单的类定义出来了,这个时候我们要把它实例化,就是将它具体成某个特定的对象(比如说具象成“老王”)
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
# 我们将neighbour_wang变量指向的就是一个Person的实例,在这个过程中我们必须传递的参数和__init__中除self之外所需的参数(如果说__init__在定义的时候已经给了具体的默认值,这个时候我们就可以相应的不传递给默认值的那个参数)
neighbour_wang = Person('王大拿','male')
# 我们可以使用我们创建的实例对实例属性进行调用
print(neighbour_wang.name) >>>'王大拿'
print(neighbour_wang.sex) >>>'male'
# 我们也可以使用我们创建的实例对实例方法进行调用
neighbour_wang.eating() >>> i'm eating
neighbour_wang.sleeping() >>> i'm sleeping
# 当然我们也可以用我们的类调用我们的实例方法(不过这里需要有注意self=对象自己也就是neighbour_wang)
Person.eating(neighbour_wang) >>> i'm eating
实例变量和类变量的区别
#!/usr/bin/env python2.7
# -*- coding=utf-8 -*-
class Person(object):
# 在类中但是在所有函数体之外的变量,我们称之为类变量
count = 0
# 在构造函数中定义的变量我们称之为实例变量
def __init__(self, name, sex):
self.name = name
self.sex = sex
"""
count变量是类变量(它的值将在这个类的所有实例之间共享,但是实例调用赋值并不能修改对应的值,这是因为,通过实例对象修改类变量的值,不是在给“类变量赋值”,而是定义新的实例变量。)
例如:
neighbour_wang.count = 1
这个时候只是创建了一个名为count的实例变量 也就是self.count = count
self.name
self.sex
我们称之为实例变量,因为它绑定在了self身上,也就是实例身上。
"""
【这里需要做一个区分:就是类变量是可变的还是不可变的】
class Foo(object):
x = 1.5
foo = Foo()
print(foo.x) #输出:1.5
print(id(foo.x)) #输出:2400205363696
foo.x = 1.7
print(foo.x) #输出:1.7
print(id(foo.x)) #输出:2400203142352 和上面的id不一样,表明已经新创建了一个实例属性
print(Foo.x) #输出:1.5
<<<<<<<<<<<<<>>>>>>>>>>>
class Foo(object):
x = [1,2,3]
foo = Foo()
print(foo.x) #输出:[1, 2, 3]
print(id(foo.x)) #输出:1999225501888
foo.x[2] = 4
print(foo.x) #输出:[1, 2, 4]
print(id(foo.x)) #输出:1999225501888
print(Foo.x) #输出:[1, 2, 4]
foo.x.append(5)
print(foo.x) #输出:[1, 2, 4, 5]
print(id(foo.x)) #输出:1999225501888
print(Foo.x) #输出:[1, 2, 4, 5]
有个其他疑问?
# -*- coding=utf-8 -*-
class Person(object):
count = [1,2,3,4]
def __init__(self, name, sex):
self.name = name
self.sex = sex
self.count = self.count.append(1)
def sleep(self):
pass
p1 = Person('w','f')
p2 = Person('l','m')
if __name__ == '__main__':
print p1.count
print p2.count
print Person.count
print Person.__dict__
print p1.__dict__
print p2.__dict__
“”“
这里的输出问题:(为啥p1.count输出的是None--求助:求答疑)
None
None
[1, 2, 3, 4, 1, 1]
{'count': [1, 2, 3, 4, 1, 1], '__module__': '__main__', 'sleep': <function sleep at 0x1032a42a8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, '__init__': <function __init__ at 0x1032a40c8>}
{'count': None, 'name': 'w', 'sex': 'f'}
{'count': None, 'name': 'l', 'sex': 'm'}
”“”
为了保持对编程的兴趣,我们不再过多的写内容。后续我们还是会将类以及对象中的内容分别讲述。(还是要将一句:切勿眼高手低,练习创建不同的类以及写一下自己对类和对象的一个感悟。这也是对我自己的一个忠告!)
有额外精神的小伙伴:
type是一切类对象的类,也就是元类(元始天尊?)