面向过程:根据业务逻辑从上到下写代码
面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
面向对象编程的2个非常重要的概念:类和对象
对象是面向对象编程的核心,在使用对象的过程中,为了将具有共同特征和行为的一组对象抽象定义,提出了另外一个新的概念——类
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象
类与对象的关系:类就是创建对象的模板
13.1. Python定义类并创建实例
13.1.1 类(Class) 由3个部分构成:
类的名称:类名
类的属性:一组数据
类的方法:允许对进行操作的方法 (行为)
对象 = 属性 + 方法
静态 + 动态
引入:
案例一:人类设计,只关心3样东西:
事物名称(类名):人(Person)
属性:身高(height)、年龄(age)
方法(行为/功能):跑(run)、打架(fight)案例二:狗类的设计
类名:狗(Dog)
属性:品种 、毛色、性别、名字、 腿儿的数量
方法(行为/功能):叫 、跑、咬人、吃、摇尾巴
13.1.2 以 Person 为例,定义一个Person类如下:
class Person(object):
pass
xiaoming=Person();
xiaohong=Person();
print(xiaoming)#<__main__.Person object at 0x000001C113239128>
print(xiaohong)#<__main__.Person object at 0x000001C113239160>
print(xiaohong==xiaohong)#False
按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我们只需要简单地从object类继承。
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作
13.2.创建对象
通过上一节课程,定义了一个Car类;就好比有车一个张图纸,那么接下来就应该把图纸交给生成工人们去生成了
python中,可以根据已经定义的类去创建出一个个对象
创建对象的格式为:
对象名 = 类名()
创建对象demo:
# 定义类
class Car:
# 移动
def move(self):
print('车在奔跑...')
# 鸣笛
def toot(self):
print("车在鸣笛...嘟嘟..")
# 创建一个对象,并用变量BMW来保存它的引用
BMW = Car()
BMW.color = '黑色'
BMW.wheelNum = 4 #轮子数量
BMW.move()
BMW.toot()
print(BMW.color)
print(BMW.wheelNum)

总结:
- BMW = Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法
- 第一次使用BMW.color = '黑色'表示给BMW这个对象添加属性,如果后面再次出现BMW.color = xxx表示对属性进行修改
- BMW是一个对象,它拥有属性(数据)和方法(函数)
- 当创建一个对象时,就是用一个模子,来制造一个实物
13.3. Python中创建实例属性
虽然可以通过Person类创建出xiaoming、xiaohong等实例,但是这些实例看上除了地址不同外,没有什么其他不同。在现实世界中,区分xiaoming、xiaohong要依靠他们各自的名字、性别、生日等属性。
如何让每个实例拥有各自不同的属性?由于Python是动态语言,对每一个实例,都可以直接给他们的属性赋值,例如,给xiaoming这个实例加上name、gender和birth属性:
class Person(object):
pass
xiaoming=Person();
xiaohong=Person();
xiaoming.name="小明"
xiaoming.age=12
xiaoming.grade=3
xiaohong.name="小红"
xiaohong.age=19;
xiaohong.sex="女"
print(xiaoming)#地址
print(xiaohong)#地址
print(xiaoming.name)#小明
print(xiaoming==xiaohong)#False
13.4. Python中初始化实例属性
在定义 Person 类时,可以为Person类添加一个特殊的init()方法,当创建实例时,init()方法被自动调用,我们就能在此为每个实例都统一加上以下属性:
class Person:
def __init__(self,name,sex,age):
self.name=name;
self.sex=sex;
self.age=age;
person1=Person("小明","男",19);
person2=Person("小红","女",20);
print(person1.name,person1.sex,person1.age);#小明 男 19
print(person2.name,person2.sex,person2.age);#小红 女 20
init()方法,在创建一个对象时默认被调用,不需要手动调用init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么init(self)中出了self作为第一个形参外还需要2个形参,例如init(self,x,y)
init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
13.5. Python中访问限制
我们可以给一个实例绑定很多属性,如果有些属性不希望被外部访问到怎么办?
Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问
class Person(object):
def __init__(self, name, score):
self.name = name
self.__score = score
p = Person('Bob', 59)
print(p.name,p._score);
但是,如果一个属性以"xxx"的形式定义,那它又可以被外部访问了,以"xxx"定义的属性在Python的类中被称为特殊属性,有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"xxx"定义。
13.6. python中定义实例方法
一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用?
虽然私有属性无法从外部访问,但是,从类的内部是可以访问的。除了可以定义实例的属性外,还可以定义实例的方法。
实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的:
class Person:
def __init__(self,name,age):
self.__name=name
self.age=age
def getName(self):
return self.__name;
person1=Person("张三",19)
print(person1.getName())
13.7. python中创建类属性
类是模板,而实例则是根据类创建的对象。
绑定在一个实例上的属性不会影响其他实例,
但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!
也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。
class Person:
#声明address地址
address="earth"
def __init__(self,name,age):
self.name=name
self.age=age
person1=Person('zhangsan',19)
print(person1.address)#earth
print(Person.address)#earth
13.8. python中定义类方法
和属性类似,方法也分实例方法和类方法。
在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。
class Person(object):
count=0
@classmethod
def howMany(cls):
return cls.count
def __init__(self,name):
self.name=name
Person.count=Person.count+1
print(Person.count,"-----------")
person1=Person("张三");
print(person1.howMany())#1
print(Person.howMany())#1
作者:Anwfly
链接:https://www.jianshu.com/p/9c77e40894d2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。