面向对象是一种编程思想,现在主流的编程思想有两种:面向过程、面向对象,这其中以面向过程为代表的有C语言,面向过程则是JAVA和Python。
面向过程是把一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。
面向对象则不注重过程,而是会把事物抽象成对象的概念就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
对象和类是面向对象的两个核心点,我们首先要把他们区分出来。
对象:对象就是一个具体的事物,比如看到一只猫,看见的是眼前的这只猫,它有特有的眼睛鼻子嘴巴
类:类就是收集了对象的一些属性和方法,比如现在想一只猫,脑海中想的是猫的基本特征,比如眼睛鼻子嘴巴大概的样子,身体大概的样子。
class Cat: age = "" 类属性 def age_get(self): 类方法 print(age)
cat1 = Cat() cat2 = Cat() cat3 = Cat()
class Dog: color = "yellow" age = "2" def eat(self): print("狗在吃骨头") dog = Dog() dog.eat()
当创建一个对象时,就是用同一个模子,来制造一个实物
class Dog: # 创建一个狗类 color = "yellow" # 狗的颜色类属性 age = "2" # 狗的年龄类属性 def eat(self): # 狗的类方法 print("狗在吃骨头") dog = Dog() # 实例化狗对象 dog.color = "黄色" # 给狗对象的颜色属性改变 print("狗的颜色是:%s 狗的年龄是:%s" % (dog.color, dog.age)) dog.eat()
注意:dog.color = "黄色" 这里改变的是dog这个对象的color属性,类Dog的color并没有改变
class Dog: # 创建一个狗类 color = "yellow" # 狗的颜色类属性 age = "2" # 狗的年龄类属性 def output(self): # 狗的类方法 print(self.color) # self是对象本身的意思,这里是指Dog对象的color print(self.age) dog = Dog() # 实例化狗对象 dog.color = "黄色" # 给狗对象的颜色属性改变 dog.output() # 调用对象的函数
类中调用自己的类属性要用到self
魔法函数是在创建对象时就会调用,我们可以利用它这一特性,从而在创建对象的时候就给对象属性赋值。
class Cat: name = "咪咪" age = "3" sex = "母" def __init__(self, a, b, c): # 魔法函数__init__我们在这里给三个形参,把它们给对象属性 super().__init__() self.name = a self.age = b self.sex = c def __del__(self): # 魔法函数__del__ 被删除时会调用 return "我被删除了" def __str__(self): # 魔法函数__str__ 输出对象时调用 return "输出了对象本身" def output(self): print(self.name) print(self.age) print(self.sex) cat = Cat("小菊", "1", "4") # 传入__init__参数 cat.output() print(cat) # 输出对象
魔法函数是在创建对象时调用,多数用在创建对象时要新值时使用
装饰器是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。
class Room: def __init__(self, name, ower, width, length, heigh): self.Name = name self.Ower = ower self.Width = width self.Length = length self.Heigh = heigh @property # 把一个方法变成一个数据属性 def cal_area(self): print("%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)) r1 = Room("厕所", "北爷", 2, 2, 20000) # 实例化出来一个实例r1,实例化的过程就是执行__init__ r2 = Room("北京", "喵爷", 20, 60, 20000) r1.cal_area # 用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用 r2.cal_area
class Room: tag = 1 # 定义一个类的数据属性 def __init__(self, name, ower, width, length, heigh): self.Name = name self.Ower = ower self.Width = width self.Length = length self.Heigh = heigh @classmethod # 这个装饰器是专门供类使用的方法 def tell_info(cls): # cls代表类本身 print(cls) print("---", cls.tag) @staticmethod # 静态方法 叫类的工具包,不跟类绑定也不跟实例绑定 def wash_body(a, b, c): print("%s %s %s 正在洗澡" % (a, b, c)) Room.wash_body("北爷", "喵爷", "修电脑") # 用类调用washbody这个方法 r1 = Room("厕所", "北爷", 2, 2, 20000) # 实例化一个实例r1 r1.wash_body("北爷", "喵爷", "修电脑") # 用实例调用washbody这个方法
class Room: tag = 1 # 定义一个类的数据属性 def __init__(self, name, ower, width, length, heigh): self.Name = name self.Ower = ower self.Width = width self.Length = length self.Heigh = heigh @classmethod # 这个装饰器是专门供类使用的方法 def tell_info(cls): # cls代表类本身 print(cls) print("---", cls.tag) # 等价于Room.tag Room.tell_info() # 会自动把类本身传给cls
这就是面向对象的基本用法。面向对象还有(封装、继承、多态)这三个是面向对象的三大特性