面向对象与面向过程的区别:
面向过程——步骤化
- 面向过程就是分析出实现需求所需要的步骤,通过函数(方法)一步一步实现这些步骤,接着依次调用即可。
面向对象——行为化
- 面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成类(类实例化后才是对象),创建了对象不是为了完成某一个步骤,而是描述某个事物在解决问题的步骤中的行为。
类和对象:
1、什么是类? ------- 类别 关键字 class 进行定义类 2、对象 ------- 类的实例,是一个真实存在的事物 3、定义的类: 通过class 关键字定义,类里面可以包含属性 4、类名的命名规范:遵循大驼峰法 user_name UserName 代码演示:class User(object):
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def study(self):
print("阿文爱学习!!")
print("i'm " +self.name+ " love study!")
def __str__(self):
return "[name = "+self.name+",age = "+self.age+",gender = "+self.gender+"]"
if __name__ == '__main__':
u = User("zhangsan","18","boy")#构建对象时将属性写入对象之中
print(u)
print(u.name)
u.study()
解释:只要在类中定义了__str__(self)
方法,那么当使用print
打印实例对象的时候,就会直接打印出在这个方法中return
的数据。这就是这个方法的好处,你可以利用这个方法的返回值直接打印对象。
面向对象的三大特征:封装,继承,多态
1、封装
面向对象的封装特指的是将属性和方法封装到一个类或者多个类中,在需要使用的时候,通过对象 调用对用的方法或者属性。 隐藏对象的属性和实现细节,仅对外提供公共访问方式。【好处】 1. 将变化隔离; 2. 便于使用;3. 提高复用性; 4. 提高安全性;
【封装原则】1. 将不需要对外提供的内容都隐藏起来;2. 把属性都隐藏,提供公共方法对其访问。
第一种方法:get和set方法
class User(object):
def __init__(self,username,age,gender):
self.__username = username #__username表示将属性username私有化
self.__age = age
self.__gender = gender
def __str__(self):
return "name:"+self.__username+" 年龄:"+self.__age+" 性别:"+self.__gender+""
#get方法
def get_username(self): #通过get方法访问私有属性
return self.__username
#set方法
def set_username(self,name): #定义一个方法,通过set方法修改私有属性username
self.__username = name
u1 = User("阿文","18","boy")
print(u1)
print(u1.get_username()) #通过get方法访问私有属性__username
u1.set_username("小明") #通过set_username方法修改名字
print(u1)
在变量名前加下划线:把参数设置为私有变量,然而这样属性在外部就不可读写,这时需要增加get、set方法。但是这样在外部调用时代码很繁琐,所以用装饰器@property简化get、set方法。
第二种方法:property()
class User(object):
def __init__(self,username,age,gender):
self.__username = username
self.__age = age
self.__gender = gender
def __str__(self):
return "name:"+self.__username+" 年龄:"+self.__age+" 性别:"+self.__gender+""
#get方法
def get_username(self):
return self.__username
#set方法
def set_username(self,name):
self.__username = name
change = property(get_username,set_username) #通过get和set命名一个方法change,可以访问和修改私有化属性
u1 = User("阿文","18","boy")
print(u1.change)
u1.change = "小明"
print(u1)
Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,依旧使用“类对象.属性”的方式操作类中的属性property()。
函数的基本使用格式:属性名=property(fget=None, fset=None, fdel=None, doc=None)
第三种方法:通过装饰器@property在get方法上进行装饰
class User(object):
def __init__(self,username,age,gender):
self.__username = username
self.__age = age
self.__gender = gender
def __str__(self):
return "name:"+self.__username+" 年龄:"+self.__age+" 性别:"+self.__gender+""
@property
def username(self): #这里的username和下面@username.setter中的username必须一致
return self.__username
@username.setter
def username(self,name):
self.__username = name
u1 = User("阿文","18","boy")
print(u1.username)
u1.username = "小明"
print(u1)
2、继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的功能。 在python中一个类能继承自不止一个父类,这叫做python的 多重继承 。
class RichMan(object):
def __init__(self):
self.money = 1000000000
self.company = "阿里巴巴"
def tell_motto(self):
print("我对钱不感兴趣。(—_—)")
def __myself(self): #定义一个私有属性的方法
print("我以前是一个教师。")
class Son(RichMan): #括号中写RichMan表示继承的父类是RichMan
#继承RichMan类
pass
s = Son()
print(s.money)
print(s.company)
s.tell_motto() #访问父类中的tell_motto方法
上面的代码:RichMan是父类,Son是子类
子类可以继承父类的属性和方法。
注意:继承父类并不是所有的方法和属性都能继承,只能继承公开的属性和方法,私有的属性和方
法是不能被继承的。如上面的代码中,私有方法__myself(self)不能被子类Son继承。
重写:
class RichMan(object):
def __init__(self):
self.money = 1000000000
self.company = "阿里巴巴"
def tell_motto(self):
print("我对钱不感兴趣。(—_—)")
def working(self):
print("A员工表现的好。")
class Son(RichMan):
#继承RichMan类
def working(self):
print("B员工表现的更好!")
s = Son()
print(s.money)
print(s.company)
s.tell_motto()
s.working()
继承可以实现方法的重写
方法的重写(覆盖
Override
)
:
在继承的基础之上,如果子类的方法父类不能满足自己使用的时候,那 么可以重写这个方法。
注意:重写方法的时候,方法的名称、参数一定要和父类必须一致。
例如上面的代码:父类RichMan和子类Son中都有相同的方法working,虽然Son继承于RichMan,但是依然执行Son中的方法。
面试题:python 中有没有方法的重载?有没有方法的重写?
方法的重载(Overload): 函数名称相同,但是函数的参数个数或者类型不同
结论:python中有方法的重写,但是没有方法的重载,但是可以实现方法的重载(装饰器)。
Python
是支持多继承,
class Son(RichMan,object
,
XXX,XXXX)
那么如果
A
类是继承
B
类和
C
类,
B
和
C
同时有一个
H
()方法,请问
A
继承的是哪个
H
()?
按照继承的顺序来找(广度优先)。
super
关键字:是一个指针,默认指向的父类
class RichMan(object):
def working(self):
print("A员工表现的好。")
class Son(RichMan):
#继承RichMan类
def working(self):
print("B员工表现的更好!")
def test(self):
self.working()
super().working() #用super关键字指向父类
s = Son()
s.test()