python学习十二(面向对象)

 对象(object)
面向对象(oop)
- python是一门面向对象的编程语言
- 面向对象的语言,就是编程语言中的所有操作都是通过对象来进行的
- 面向过程的编程的语言
- 面向过程指的是,将我们程序的逻辑分解为一个一个的步骤,通过对每个步骤的抽象,来完成程序
- 面向过程的编程思想将一个功能分解为一个一个的小步骤,我们通过完成一个一个的小步骤来完成一个程序
- 这种编程方式,符合人类的思维,编写起来相对比较简单
- 但是这种方式编写的代码只适用于一功能,并且难于维护
- 面向对象对象的编程语言
- 面向对象的编程语言,关注的是对象,而不关注过程
- 对于面向对象的语言来说,一切都是对象
- 面向对象的编程思想,将所有的功能统一保存到对应的对象中,要完成某个对象,直接找到对应的对象即可
- 这种方式编写的代码,比较容易阅读,并且易于维护
- 但是这种方式编写,不太符合常规的思维,编写起来稍微麻烦
类(class)
- python内置对象(数字,元组,字典,列表,字符串...)
- 但是内置对象并不能满足所有的需求,所有在开发时经常需要自定义一下对象
- 类
- 相当于一个图纸,在程序中我们需要根据类来创建对象
- 像int(),bool(),str()list()dict()...这些都是类
- a = int(20) #创建一个int类的实例
- 我们自定义的类都需要使用大写字母开头
- 类也是一个对象(一切皆是对象的原则)!

类的简介
定义一个简单的类,使用class关键字来定义类,
语法:
class 类名([父类]):
代码块

class MyClass(): # 空对象
pass
print(MyClass)
使用MyClass创建一个对象
使用类来创建对象,就像调用一个函数一样
mc = MyClass() # mc就是通过MyClass创建的对象,mc就是MyClass的实例
print(mc,type(mc))

isinstance()用来检查一个对象是否是一个类的实例
class MyClass(): # 空对象
pass
mc = MyClass()
mc2 = MyClass
print(mc,type(mc))
r = isinstance(mc,mc2) # 判断是否是一类的实例
print(r)

现在我们通过MyClass这个类创建的对象就是一个空对象
可以向对象中添加变量,对象中的变量称为属性
语法:对象.属性名 = 属性值(可以是任意类型包括函数)
class MyClass():
pass
mc = MyClass
mc.name = "jkd" # 对象.属性名 = 属性值
print(mc.name)

定义类型:
- 所有的事物都由两部分构成:
1.数据(属性)
2.行为(方法)
- 在类的代码块中,我们可以定义变量和函数,
变量会成为该类实例的公共属性,所有的该类实例都可以通过 对象.属性名 的形式访问
函数会成为该类实例的公共方法,所有该类实例都可以通过 对象.方法名() 的形式调用方式
- 注意:
方法调用时,第一个参数由解释器自动传递,所以定义方法时,至少要定义一个形参!

- 实例为什么能访问到类中的属性和方法
类中定义的属性和方法都是公共的,任何该类实例都可以访问
- 属性和方法查找的流程
当我们调用一个对象的属性是,解释器会先在当前对象中寻找是否含有该属性,
如果没有,则去返回当前对象的属性值,
如果没有,则去当前对象的类对象中去寻找,如果有就返回类对象的属性值,
如果还是没有则报错!
- 类对象和实例对象中都可以保存属性(方法也一样)
- 如果这个属性(方法)是所有的实例共享的,则应该将其保存到类对象中
- 如果这个属性(方法)是某个实例独有的,则应该保存实例对象中

- 一般情况下,属性保存实例对象中,方法保存到类对象中

class Person():
# 在类的代码块中,我们可以定义变量和函数
# 在类的我们定义的变量,将会成为所有实例的公共属性,所有实例都可以访问这些变量
name = "swk" # 公共属性,所有实例都可以访问

# 在类中也可以定义函数,类中定义的函数,称为方法,这些方法可以通过该类的所有实例来访问
def say_hello(s,i):
return ("hello %s " %i)

p1 = Person()
p2 = Person()
print(p1.say_hello("swk"))
print(p2.name)

创建对象的流程:
p1 = Person()的运行过程
1.创建一个变量
2.在内存中创建一个新对象
3.__init__(self)方法执行
4.将对象的id赋值给对象

类的基本结构:
class ;类名([父类]):
公共属性...
# 对象的初始化方法
def __init__(self,...):
代码块
# 其他的方法可以是多个
def method_1(self,...):
.....
.....

class Person:
def __init__(self,name):
self.name = name
def st(self):
return ("大家好,我是%s"%self.name)

p1 = Person("swk")
p2 = Person("zbj")
p3 = Person() # 这个因为没有赋初始化的值,会报错
print(p1.st())
print(p2.st())
print(p3.st())

- 练习:
尝试自定义一个表示狗的类(Dog)
属性:
name,age,gender,height
方法:
cry()
class Dog():
def __init__(self,name,age,gender,height):
self.name = name
self.age = age
self.gender = gender
self.height = height
def cry(self):
return (self.name,"在叫")

p1 = Dog("小黑",8,"male",30)
p2 = Dog("旺财",9,"male") # 报错,默认值没有填满
print(p1.cry())
print(p2.cry())
现在我们需要一种方式来增强数据的安全性
1.属性不能随意修改
2.属性不能修改为任意的值(如:年龄不能是负数)


重写:
# 如果在子类中如果有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,
这个特点称为方法的重写

class Animal: # 父类
def run(self):
print("在跑")
def sleep(self):
print("睡觉")

class Dog(Animal): # Animal的子类
def bark(self):
print("叫")
def run(self):
print("狗跑")

Dog = Dog()
Dog.run()

# 当调用这个对象的方法时,会优先在当前对象中寻找是否具有该方法,如果有则直接调用
如果没有,则区去当前对象的父类中寻找,如果还是没有就往在上级对象中寻找

class A(object):
def test(self):
print("AAA")
class B(A):
pass
class C(B):
pass

C = C()
C.test()
posted @ 2019-08-21 13:41  wenjian022  阅读(150)  评论(0编辑  收藏  举报