一、什么是面向对象
面向对象是一种编程思想,现在主流的编程思想有两种:面向过程、面向对象,这其中以面向过程为代表的有C语言,面向过程则是JAVA和Python。
面向过程是把一个个函数和数据(用于方法的参数) 。然后按照一定的顺序,执行完这些方法(每个方法看作一个过程),等方法执行完了,事情就搞定了。
面向对象则不注重过程,而是会把事物抽象成对象的概念就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
二、类和对象
对象和类是面向对象的两个核心点,我们首先要把他们区分出来。
对象:对象就是一个具体的事物,比如看到一只猫,看见的是眼前的这只猫,它有特有的眼睛鼻子嘴巴
类:类就是收集了对象的一些属性和方法,比如现在想一只猫,脑海中想的是猫的基本特征,比如眼睛鼻子嘴巴大概的样子,身体大概的样子。
三、定义类和对象
定义一个类的格式
class Cat:
age = "" 类属性
def age_get(self): 类方法
print(age)
- 定义类的时候一定要有的类属性和类方法,属性是类的一些基本数据,类方法是类的特有功能。
- 类的名字定义首字母大写
- age_get是一个实例方法,第一个参数一般是self,表示实例对象本身
创建一个类(实例化对象)
cat1 = Cat()
cat2 = Cat()
cat3 = Cat()
- python中可以根据已经定义的值创建多个对象
创建类和实例化对象
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
这就是面向对象的基本用法。面向对象还有(封装、继承、多态)这三个是面向对象的三大特性