Python面向对象

川长思鸟来 2021-12-09 23:55 505阅读 0赞

Python面向对象

每次默认调用的方法是new,程序先调new再掉init

init可以完成参数赋值等一些基本的初始化工作

init和new的参数要保持一致

创建与删除对象

init 创建对象

  1. 当创建一个对象时,python解释器默认会调用一个方法,这个方法是: __init__()
  2. #给定默认值 xxxx 21
  3. def __init__(self,name="xxxx",age=21):
  4. def __init__(self,*args,**kwargs):
  5. class Person(object):
  6. def __init__(self,name,age):
  7. self.name = name
  8. self.age = age
  9. def run(self):
  10. # print("persion is running")
  11. print("%s is running" %self.name)
  12. p = Person("zhangsan",18)
  13. p.run()
  14. class Animal:
  15. # 对象初始化时调用
  16. def __init__(self,name):
  17. self.name = name
  18. print(self.name+"来了")
  19. # 创建对象,初始化 init方法调用
  20. an = Animal("唐僧")

new 构造器

  1. 构造器__new__ 构造器中的参数要和init中的参数一样,换而言之,无论什么情况initnew参数保持一致
  2. 一定要有返回值
  3. def __init__(self,name,age):
  4. self.name = name
  5. self.age = age
  6. def __new__(cls,name,age):
  7. cls.name = name
  8. cls.age = age
  9. return object.__new__(cls)

del 删除

  • 调用:

    当删除一个对象时,

    1. python解释器也会调用一个方法,这个方法是: __del__()

    最后释放内存时调用
    若多个对象n指向同一个类,则此时计数器的个数为n.
    每次调用del方法时删除的是计数器的个数(n-1),也就是说每调用一次del就删除一下,计数器总个数-1
    若计数器为1时再调用,则删除该对象

  • 案例:

    class Animal:

    1. # 对象被回收时调用
    2. def __del__(self):
    3. print(self.name+"被妖怪抓走了")

    手动删除对象,之后将不能在被使用,如果使用会报错

    del an

    print(an.name)

    如果没有手动删除,对象将在使用完才被系统收走

  • 案例:

    1. # 创建对象,初始化 init方法调用
    2. an = Animal("唐僧")
    3. # 手动删除对象,之后将不能在被使用,如果使用会报错
    4. an1 = an
    5. an2 = an
    6. print(id(an))
    7. print(id(an1))
    8. print(id(an2))
    9. print("马上删除对象an")
    10. del an
    11. print("马上删除对象an1")
    12. del an1
    13. print("马上删除对象an2")
    14. # 这句代码执行完毕,对象才会被真正删除(引用计数)
    15. del an2
    • 引用计数:

      刚创建出来的时候为2,增加一个引用,引用计数+1,
      del 对象 ,可以减少引用计数,当引用计
      数为1时,在del 对象,才会真正被回收

魔法方法1—id

  1. 类似于java内存地址的值,用于判断对象是否是单例模式
  2. #此时ip一样 #此时id不一样
  3. p1 = person(xxxxxxxx) p1 = persion(xxxxxx)
  4. p2 = p1 p2 = persion(xxxxxx)
  5. print(id(p1)) print(id(p1))
  6. print(id(p2)) print(id(p2))

魔法方法2—str

  1. 类似于javatoString打印的方法

共有/私有转换

  1. # 私有方法
  2. def test(self):
  3. print("调用test共有方法")

继承

单继承

  • 继承概念

    1. 用来描述类与类之间的一种关系:
    2. 父类、超类、基类
    3. 子类、派生类
  • 继承的语法

    1. class 子类(父类名,...):
    2. 方法...
    3. 如果一个类没有明确指明父类,则它的父类为object
  • 案例:

    • 定义Cat类,包含属性: name,color,age;方法:eat() sleep() catchmouse()
    • 定义Dog类,包含属性: nage,color,age;方法:eat() sleep() lookafterHouse()
    • 发现许多重复的东西,优化,抽离一个父类Animal出来
  • 总结:

    • 子类可以继承父类中所有的属性跟方法(私有除外)
    • 私有属性不能通过对象直接访问,但可以通过方法访问
    • 私有方法,不能通过对象直接访问
  • 属性自动化赋值(高级用法)(setattr,getattr,hasattr,isinstance函数的使用)

    1. # 属性自动化赋值
    2. class Dog():
    3. def __init__(self,name,age,gender,color,breed):
    4. print(locals())
    5. # pass
    6. self.attributeFromdict(locals())
    7. # 自定义方法,设置属性
    8. def attributeFromdict(self,d):
    9. self = d.pop('self')
    10. for n, v in d.items():
    11. # 内置函数,为self的属性赋值value
    12. setattr(self,n,v)
    13. def showinfo(self):
    14. print(self.name)
    15. print(self.age)
    16. print(self.breed)
    17. print(self.gender)
    18. dog =Dog('aa',12,'男','red','京巴')
    19. dog.showinfo()

多继承

  • 概念

    1. 所谓多继承,就是一个类同时有多个父类
    2. 思考:狼狗的父类
    3. 狼、狗
  • 语法

    1. class 子类(父类1,父类2):
    2. 方法...
    3. 如果父类1,父类2中都有属性,则以先继承的类为标准,如果两个父类存在同名方法,则一样
    4. 以先继承的类为准,所有父类中的非同名方法都能被继承到
    5. 若父类都有相同名的方法,则先调用(xx,oo)括号里前面的父类方法
    6. 两个父类中的方法,属性,都会被子类继承
    7. class AAA():
    8. def methodAAA(self):
    9. print("a的方法a")
    10. # 新增方法,BBB类中有同名方法
    11. def methodBBB(self):
    12. print("a的方法b")
    13. class BBB():
    14. def methodBBB(self):
    15. print("b的方法b")
    16. class CCC(AAA,BBB):
    17. def methodCCC(self):
    18. self.methodAAA()
    19. self.methodBBB()
    20. print("c的方法c")
    21. ccc = CCC()
    22. ccc.methodCCC()
    23. # 执行结果
    24. # a的方法a
    25. # a的方法b
    26. # c的方法c

重写

重写父类的方法与调用父类的方法

  • 方法重写概念:

    1. 所谓重写,就是在子类中,有一个和父类相同名字的方法,子类中的方法会覆盖掉父类中的同名方法
  • 方法重写案例:

    1. class SuperClass():
    2. def __init__(self):
    3. print("父类的初始化方法")
    4. def test(self):
    5. print("父类的测试方法")
    6. class SubClass(SuperClass):
    7. def __init__(self):
    8. print("子类的初始化方法")
    9. def test(self):
    10. print("子类的测试方法")
    11. sub = SubClass()
    12. # 这里的test方法,调用的为子类中重写的方法
    13. sub.test()
    14. # 执行结果
    15. # 子类的初始化方法
    16. # 子类的测试方法
  • 调用父类方法:

    1. class Cat(Animal,Active):
    2. #1 super().__init__(name)
    3. #2 Animal.__init__(self,name)

    class SuperClass():

    1. def __init__(self,name):
    2. self.name = name
    3. def test(self):
    4. print("父类的测试方法")

    class SubClass(SuperClass):

    1. def __init__(self,name,age):
    2. # SuperClass.__init__(self,name)

    super(SubClass, self).init(name)

    super().init(name)

    1. self.age = age
    2. # 子类重写父类方法
    3. def test(self):
    4. print("子类的测试方法")
    5. print('name:'+self.name+",age:"+str(self.age))

    sub = SubClass(‘aa’,12)
    sub.test()

    执行结果

    子类的测试方法

    name:aa,age:12

多态

  • 概念

    • 定义时的类型跟运行时的类型不一样,此时就成为多态
      严格意义上来讲,python中的多态不叫真正的多态,称之为鸭子类型更合适
    • 鸭子类型

      “鸭子类型”的语言是这么推断的:一只鸟走起来像鸭子、游起泳来像鸭子、叫起来也像鸭子,
      那它就可以被当做鸭子。也就是说,它不关注对象的类型,而是关注对象具有的行为(方法)。

    • 鸭子类型弊端

      “鸭子类型”语言的程序可能会在运行时因为不具备某种特定的方法而抛出异常:

      案例1:
      如果一只小狗(对象)想加入合唱团(以对象会不会嘎嘎嘎叫的方法为检验标准),
      也学鸭子那么嘎嘎嘎叫,好吧,它加入了,可是加入之后,却不会像鸭子那样走路,
      那么,迟早要出问题的。

      案例2:
      一只小老鼠被猫盯上了,情急之下,它学了狗叫,猫撤了之后,小老鼠的妈妈不无感叹的
      对它说:看吧,我让你学的这门儿外语多么重要啊。这虽然是个段子,但是,由于猫在
      思考时,使用了 “鸭子测试”,它以为会叫的就是狗,会对自己产生威胁,所以撤退了,
      也正是因为这个错误的判断,它误失了一次进食机会。

  • 用法

    class F1(object):

    1. def show(self):
    2. print("F1.show")

    class S1(F1):

    1. def show(self):
    2. print("S1.show")

    class S2(S1):

    1. def show(self):
    2. print("S2.show")

    def func(obj):

    1. obj.show()

    obj1 = F1()
    func(obj1)
    obj1 = S1()
    func(obj1)
    obj1 = S2()
    func(obj1)

类属性、实例属性

类属性:class内,方法外

实例属性:方法内

  • 类属性

    属于类对象所拥有的属性,它被所有类对象的实例对象所公有,在内存中只有一份

  • 类属性的访问方式

    • 在类外可以通过类名访问

      类名.属性名

    • 在类外可以通过实例对象访问

      对象名.属性名

  • 案例:

    class Student:

    1. # 类属性
    2. schoolName="湖南"
    3. def __init__(self,name,age):
    4. # 实例属性
    5. self.name = name
    6. self.age = age

    st1 = Student(‘陈独秀’,29)

    通过类名访问类属性

    print(Student.schoolName)

    通过对象访问类属性

    print(st1.schoolName)

    通过对象访问修改属性,会新增对象属性,之后通过对象访问类属性将无法访问到,因为会被新增的对象属性屏蔽

    st1.schoolName = ‘京南校区’

    类属性访问结果不变

    print(Student.schoolName)

    这只能访问到对象属性

    print(st1.schoolName)

    可以手动删除新增的对象属性

    del st1.schoolName

    因为对象属性被删除,所以,这访问的依旧是类属性

    print(st1.schoolName)

静态方法和类方法

  • 类方法 @classmethod 实例属性+ @classmethod 变成类属性

    • 概念

    是类对象所拥有的方法,需要用 @classmethod 来表示,类方法第一个参数必须为类对象
    一般使用’cls’, 类方法能够通过类名和对象进行访问

    • 用法:
      class Student:

      类属性

      schoolName=“湖南”
      def init(self,name,age):
      # 实例属性
      self.name = name
      self.age = age

      类方法 (可以直接访问类属性,因此get方法中不能有self关键字,要用cls)

      @classmethod
      def getSchoolName(cls):
      return cls.schoolName

      @classmethod
      def setSchoolName(cls,newSchoolName):
      cls.schoolName = newSchoolName

    st2 = Student(‘李大钊’,30)
    Student.schoolName = ‘北平学校’

    通过对象访问类方法

    print(st2.getSchoolName())

    通过类名方法类方法(使用较多)

    print(Student.getSchoolName())
    Student.setSchoolName(‘同济学校’)
    print(Student.getSchoolName())
    注意: 类方法中可以直接修改当前类的类属性

  • 静态方法 @staticmethod

    • 概念

      需要使用 @staticmethod 进行修饰,静态方法不需要定义参数

    • 用法

      可以访问类属性,但是必须通过类名,
      调用方式:可以通过类名,对象进行调用
      class Student:

      1. # 类属性
      2. schoolName="湖南"
      3. def __init__(self,name,age):
      4. # 实例属性
      5. self.name = name
      6. self.age = age
      7. # 静态方法 (可以通过类名访问类属性)
      8. @staticmethod
      9. def getSchoolName():
      10. return Student.schoolName

Tips:

  • 成员属性、类属性、私有属性
  • 成员方法、类方法、静态方法、私有方法

发表评论

表情:
评论列表 (有 0 条评论,505人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Python面向对象

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对

    相关 Python 面向对象

    一、面向对象技术简介 类(Class): 用来描述具有相同的属性(变量)和方法(函数)的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的

    相关 python面向对象

    我们总是说python是一门面向对象的编程语言,那么,怎么来理解面向对象呢? 首先,要解决这个问题就要从根源出发,理解面向对象的定义。面向对象编程——Object Orien

    相关 Python面向对象

    Python面向对象 每次默认调用的方法是new,程序先调new再掉init init可以完成参数赋值等一些基本的初始化工作 init和new的参数要保持一致 创

    相关 python面向对象

    面向对象 面向对象概念 面向对象 是一种变成思想,是对现实世界中的事物进行抽象的方式。应用到代码编程设计中,是一种建立现实世界事物模型的方式。 面向对象和面向过程区别 面...