目标:理解对象和类的概念;调用的规则(对象名调用/类名调用=>属性+方法);理解继承
1.面向对象(Object Oriented Programming=OOP)和面向过程的异同
同:都是一种开发模式(思维模式) 异:通过做一道菜进行阐述
面向过程:摘菜=》洗菜=》切菜=》炒菜=》出菜 面向对象 :*找一个厨师(对象)=>【摘菜=》洗菜=》切菜=》炒菜=》出菜】 程序员而言:只负责调度对象,对象做那些事
面向过程:你=》功能方法(做事情) 面向对象 :你=》功能对象.功能方法
2. 类和对象的概念:
类 (抽象): 事和物的一个分类,只是概念【类比–制造飞机的图纸】;对象 (具体): 具体的某个事或物【类比–根据图纸创建的飞机】;总结:类是创建对象的模板。也可以说由类创建的实例,我们称之为对象
3.class
的使用【特征–属性,行为–方法】
class Hero ( object ) :
country = "蜀汉"
def fight ( self) :
print ( self)
print ( '官渡之战,袁绍惨败' )
CaoCao = Hero( )
YuanShao = Hero( )
print ( CaoCao, YuanShao)
print ( CaoCao. country)
CaoCao. fight( )
YuanShao. fight( )
*******************************output*******************************
< __main__.Hero object at 0x000001FF7697E828> < __main__.Hero object at 0x000001FF7697E0F0>
蜀汉
< __main__.Hero object at 0x000001FF7697E828>
官渡之战,袁绍惨败
< __main__.Hero object at 0x000001FF7697E0F0>
官渡之战,袁绍惨败
4.属性和方法
4.1 添加属性的方法:动态添加属性,__init__
class Hero ( object ) :
def show ( self) :
print ( '我是第一个方法' )
def show2 ( self) :
print ( '我是第二个方法' )
def info ( self) :
print ( '2.调用方法打印:' , self. name, self. weapon)
hero = Hero( )
hero. name = '刘备'
hero. weapon = '双股剑'
print ( '1.直接打印:' , hero. name, hero. weapon)
hero. info( )
*******************************output*******************************
1.直接打印: 刘备 双股剑
2.调用方法打印: 刘备 双股剑
4.2 init魔法方法:当前需要完成某个功能操作,python自动调用的方法 __init__
当前对象初始化的时候自动调用 常用来变量初始化/赋值操作 魔法方法:以__开头 以__结尾
4.2.1 __init__
不带参数
class Hero ( object ) :
def __init__ ( self) :
print ( "在创建对象时,__init__方法会被自动调用" )
self. name = "刘备"
self. weapon = "双股剑"
def move ( self) :
print ( "%s正在移动" % self. name)
hero = Hero( )
print ( '*' * 100 )
hero. move( )
*******************************output*******************************
在创建对象时,__init__方法会被自动调用
****************************************************************************************************
刘备正在移动
4.2.2 __init__
带参数
class Hero ( object ) :
def __init__ ( self, name, weapon) :
print ( "在创建对象时,__init__方法会被自动调用" )
self. name = name
self. weapon = weapon
def move ( self) :
print ( "%s拿着%s正在移动" % ( self. name, self. weapon) )
hero = Hero( "张飞" , "青龙偃月刀" )
print ( '*' * 100 )
hero. move( )
*******************************output*******************************
在创建对象时,__init__方法会被自动调用
****************************************************************************************************
张飞拿着青龙偃月刀正在移动
总结:
类内部 获取”属性“or”实例方法“:通过self
获取 类外部 获取"属性"or"实例方法":通过对象名
获取
5.类的三大特征:继承,多态,封装
5.1 继承(子类可以复用父类的方法):
单继承: 子类(派生类)只继承一个父类(基类) 多继承:子类继承多个父类
同名属性or方法:先查找奔类,再查找第一个父类… 不同名:不会有任何影响 魔法属性__mro__
决定属性or方法的查找顺序
单继承
class Person ( object ) :
def __init__ ( self) :
self. name = "关羽"
self. horse = "赤兔马"
def show ( self) :
print ( self. name, self. horse)
class Student ( Person) :
pass
class Teacher ( Person) :
def __init__ ( self, name, horse) :
self. name = name
self. horse = horse
def show_new ( self) :
print ( self. name, '骑着' , self. horse)
student = Student( )
student. show( )
print ( student. horse)
teacher = Teacher( "张飞" , "乌云踏雪" )
teacher. show( )
teacher. show_new( )
print ( teacher. name)
关羽 赤兔马
赤兔马
张飞 乌云踏雪
张飞 骑着 乌云踏雪
张飞
多继承
class A ( object ) :
def show ( self) :
print ( "我是A类" )
class B ( object ) :
def show ( self) :
print ( "我是B类" )
class C ( B, A) :
def show ( self) :
print ( "我是C类" )
c = C( )
c. show( )
print ( C. mro( ) )
print ( type ( c) )
我是C类
[ < class '__main__.C' > , < class '__main__.B' > , < class '__main__.A' > , < class 'object' > ]
< class '__main__.C' >
重写父类
父类的方法满足不了子类的需求: 特点:①继承关系; ②方法名相同
class Person ( object ) :
def __init__ ( self) :
self. name = "小红"
def show ( self, name) :
print ( name)
class Student ( Person) :
def __init__ ( self) :
self. name = "小红"
def show ( self, name, age) :
print ( "我的名字:%s, 我的年龄:%d" % ( name, age) )
class Teacher ( Person) :
def __init__ ( self) :
self. name = "小红"
s = Student( )
s. show( "Jsir" , 24 )
t = Teacher( )
t. show( "张飞" )
5.2 多态:python中不是真正的多态,关注的是同一个方法,但会有不同的表现形式
class Text ( object ) :
def show ( self) :
print ( "显示文字" )
class Image ( object ) :
def show ( self) :
print ( "显示图片" )
class Video ( object ) :
def show ( self) :
print ( "显示视频" )
def show_data ( data) :
data. show( )
text = Text( )
image = Image( )
video = Video( )
show_data( text)
show_data( image)
show_data( video)
6.类属性+实例属性/对象属性
类属性:方法外和类内定义的属性 实例属性/对象属性:init方法定义的属性
class Person ( object ) :
address = "SH"
def __init__ ( self) :
self. name = "Jsir"
self. age = "24"
p = Person( )
print ( p. address)
print ( p. age, p. name)
print ( Person. address)
p. address = "HZ"
print ( p. address)
print ( Person. address)
del p. address
print ( Person. address)
Person. address = "HZ"
print ( Person. address)
print ( p. address)
总结:类属性的操作由类 完成,实例属性的操作由实例对象 完成 注意:类 不可以访问【对象属性】,实例对象 可以访问【类属性】,但不能修改
7.类方法+对象方法+静态方法
类方法 由类 调用(不用创建对象),对象方法 由对象 调用静态方法 :不需要当前类,也不需要当前对象;调用–类.静态方法(),对象名.静态方法()注意:
类 可以调用对象方法 (需要传递对象参数,即需要先创建对象)对象 可以调用类方法 (对象名.类方法) 理解cls
参数和self
参数 类属性 的修改 :类方法 + 对象方法
class Person ( object ) :
address = "SH"
@classmethod
def get_address ( cls) :
return cls. address
def show ( self) :
print ( "我是一个对象方法" )
@staticmethod
def get_address2 ( ) :
return Person. address
p1 = Person( )
print ( p1. get_address( ) )
print ( Person. get_address( ) )
p2 = Person( )
print ( p2. show( ) )
print ( Person. show( p2) )
p3 = Person( )
print ( p3. get_address2( ) )
print ( Person. get_address2( ) )
class Person ( object ) :
__address = "SH"
@classmethod
def get_address ( cls) :
return cls. __address
@classmethod
def set_address ( cls, address) :
cls. __address = address
p = Person( )
print ( p. get_address( ) )
p. set_address( "HZ" )
print ( p. get_address( ) )
print ( Person. get_address( ) )
class Person ( object ) :
__address = "SH"
def instance_set_address ( self, address) :
self. __class__. __address = address
def instance_get_address ( self) :
return self. __class__. __address
p = Person( )
print ( p. instance_get_address( ) )
p. instance_set_address( "HZ" )
print ( p. instance_get_address( ) )
Person. instance_set_address( p, "SZ" )
print ( p. instance_get_address( ) )
print ( Person. instance_get_address( p) )
8.私有方法+私有属性(了解)
私有 只要在方法/属性前添加 __
查看私有实例属性 对象名.__dict__
查看私有方法 类.__dict__
class Person ( object ) :
def __init__ ( self, name, age) :
self. name = name
self. __age = age
def show ( self) :
print ( "我是共有方法" )
def __newshow ( self) :
print ( "我是私有方法" )
person = Person( "Jsir" , 24 )
print ( person. name)
print ( person. __dict__)
print ( person. _Person__age)
person. __age = 110
person. __Person__age = 120
print ( person. __dict__)
print ( Person. __dict__)
print ( person. _Person__newshow( ) )
print ( object . __dict__)