攻克python3-面向对象

匿名 (未验证) 提交于 2019-12-02 22:54:36

类:是对一类具有相同属性的对象的抽象集合、蓝图

如何定义一个类:

  在python中,类的的定义分为两种

  1.python2:class 类名:

          ......

          ......

  2.python3:class 类名 (object):

          ......

          ......

类变量:

  类变量是这个类的属性,可以由类直接调用,也可以由实例调用,所有的实例共用同一个类变量,储存在类的内存空间中,在一个实例中调用或修改一个不可变类变量(整形、字符串)时,不会修改类变量的值,只是在实例中添加与类变量同名的实例变量,在实例中修改一个可变类变量(列表、字典),会修改类变量的值。

  可变变量与不可变变量参考这里

对象:
对类进行实例化,形成具有该类属性的一个具象
实例变量:





方法:




类的特性
封装

继承:




class Animal(object):     str1= "abc"     int1=12     list1=[1,2,3,4]     dict1={1:'a',2:'b'}     '''类变量'''      def __init__(self,name,age):         #构造函数,初始化实例         self.name=name         self.age=age         self.__flag=1  #私有属性         self._count=1      def __del__(self):         #析构函数         print("%s被杀了"%self.name)      def __self(self):         #私有方法         print("我是私有方法")      def eat(self,food):#方法,功能,动态属性         if self.__flag==1:             print("%s is eating %s"%(self.name,food))      def sleep(self):         self.__self()         print("%s is sleepping "%self.name)      def _foo1(self):         print("我是父类的受保护方法")  class Dog(Animal):     def __init__(self,name,age,sex,size):         super(Dog,self).__init__(name,age)         self.sex=sex         self.size=size         self._count1=2      def talk(self):         print("wolf wolf!")      def _foo2(self):         print("我是子类的受保护方法")  # 组合,但是需要通过类里所包含的类进行调用 class Cat(object):     def __init__(self,name,age,color):         self.animal=Animal(name,age)         self.color=color      def talk(self):         print("mia mia!")   d1=Dog("wr",12,"w",30) c1=Cat("lbw",9,"black")  d1.sleep() d1._foo1() print(d1._count)  c1.animal.sleep()
继承


多态:
class Animal:     def __init__(self, name):         self.name = name      def talk(self):         pass      @staticmethod     def animal_talk(obj):         obj.talk()  class Cat(Animal):     def talk(self):         print('Meow!')   class Dog(Animal):     def talk(self):         print('Woof! Woof!')   d = Dog("陈荣华") #d.talk()  c = Cat("徐良伟") #c.talk() # # def animal_talk(obj): #     obj.talk()  Animal.animal_talk(c) Animal.animal_talk(d)
多态

静态方法:

class Dog(object):     def __init__(self,name,age):         self.name=name         self.age=age      @staticmethod #静态变量     def __talk(self):         print("wolf wolf!")      @staticmethod     def _foo2(self):         print("我是子类的受保护方法")  d=Dog("wr",12)  Dog._foo2(d)

类方法:
class Dog(object):     str2='asd'     def __init__(self,name,age):         self.name=name         self.age=age      @classmethod     def _talk(cls):         print("wolf wolf!",cls.str2)      @staticmethod     def _foo2(self):         print("我是子类的受保护方法")  Dog._talk()

属性方法:
class Dog(object):     def __init__(self,name,age):         self.name=name         self.age=age      @property     def talk(self):         print("wolf wolf!")      @staticmethod     def _foo2(self):         print("我是子类的受保护方法")  d=Dog("wr",12) d.talk

''' 好吧,把一个方法变成静态属性有什么卵用呢?既然想要静态变量,那直接定义成一个静态变量不就得了么? well, 以后你会需到很多场景是不能简单通过 定义 静态属性来实现的, 比如 ,你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步: 1. 连接航空公司API查询 2. 对查询结果进行解析 3. 返回结果给你的用户 因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白 了么? ''' class Flight(object):     def __init__(self,name):         self.flight_name = name       def checking_status(self):         print("checking flight %s status " % self.flight_name)         return  0      @property     def flight_status(self):         status = self.checking_status()         if status == 0 :             print("flight got canceled...")         elif status == 1 :             print("flight is arrived...")         elif status == 2:             print("flight has departured already...")         else:             print("cannot confirm the flight status...,please check later")      @flight_status.setter     def flight_status(self,status):         # print("flight %s has changed status to %s" %(self.flight_name,status))         if status == 0 :             print("flight got canceled...")         elif status == 1 :             print("flight is arrived...")         elif status == 2:             print("flight has departured already...")         else:             print("cannot confirm the flight status...,please check later")      @flight_status.deleter     def flight_status(self):         print("1")  f = Flight("CA980") f.flight_status f.flight_status = 2 del f.flight_status f.flight_status=3
属性方法实例

 1 class Animal(object):  2     str1= "abc"  3     int1=12  4     list1=[1,2,3,4]  5     dict1={1:'a',2:'b'}  6     '''类变量'''  7   8     def __init__(self,name,age):  9         #构造函数,初始化实例 10         self.name=name 11         self.age=age 12         self.__flag=1  #私有属性 13  14     def __del__(self): 15         #析构函数 16         print("%s被杀了"%self.name) 17  18     def __self(self): 19         #私有方法 20         print("我是私有方法") 21  22     def eat(self,food):#方法,功能,动态属性 23         if self.__flag==1: 24             print("%s is eating %s"%(self.name,food)) 25  26     def sleep(self): 27         self.__self() 28         print("%s is sleepping "%self.name) 29  30 #类名(),实例化一个对象,并且返回对象的地址 31 dog=Animal("d",11) 32 cat=Animal("c",9) 33  34 #调用类变量 35 print("调用类变量:") 36 print(Animal.list1) 37  38 #调用实例变量,不能通过类调用实例属性 39 print("调用实例变量:") 40 print(dog.name) 41 print(cat.age) 42  43 #通过实例调用类变量 44 print("通过实例调用类变量:") 45 print(cat.str1) 46 print(dog.list1) 47  48 #通过实例修改不可变类变量 49 print("通过实例修改不可变类变量") 50 print("修改前:") 51 print(Animal.str1) 52 print(dog.str1) 53 print(cat.str1) 54 dog.str1="phk" 55 print("修改后:") 56 print(Animal.str1) 57 print(dog.str1) 58 print(cat.str1) 59  60  61 #通过实例修改可变类变量 62 print('通过实例修改可变类变量') 63 print("修改前:") 64 print(Animal.list1) 65 print(dog.list1) 66 print(cat.list1) 67 cat.list1.append(12) 68 print("修改后:") 69 print(Animal.list1) 70 print(dog.list1) 71 print(cat.list1) 72  73 #通过对象调用对象的方法 74 print("通过对象调用对象的方法:") 75 dog.eat("肉") 76 cat.sleep() 77  78 #通过类调用对象函数 79 print('通过类调用对象函数:') 80 Animal.sleep(dog)
类与实例互相调用对方属性

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!