1、面向对象是什么
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
例如:
class ATM():
# 属性
money = 50000
country = "china"
bank = "gonghang"
# 方法
def get_money(self, money):
print(f'get money:{money}')
实例:
具体的某个事物,实实在在的例子
实例化:创造一个类的实例,类的具体对象
例如:这里的a1和a2就是实例
# 实例化:创建一个类的实例
# a1,a2 就是实例
a1 = ATM()
a2 = ATM()
print(dir(a1))
print(a1.money, a2.country)
a1.get_money(500)
2、类的方法
①继承(Inheritance):一个派生类(derived class)继承基类(base class)的字段和方法。
写法:
class son(father):
<statement-1>
.
.
.
<statement-N>
son(派生类)这个类继承了类father(基类)里的所有属性和方法
实例:
#定义一个people类
class people:
#定义基本属性名字和年龄
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
def say(self,name,age):
print("%s 说: 我 %d 岁了")
#单继承示例
class student(people):
def say(self,name,age):
#调用父类的构函
people.say(self,name,age)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了"%(self.name,self.age))
s = student('ken',10,60)
s.speak()
②多继承:一个基类可以被多个派生类继承,也可以被派生类继承不同的属性和方法
写法:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
例:
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
#另一个类,多重继承之前的准备
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
#多重继承
class sample(speaker,student):
a =''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test = sample("Tim",25,80,4,"Python")
test.speak() #方法名同,默认调用的是在括号中参数位置排前父类的方法
③方法重写:在子类中重写父类里的方法
例:
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
3、self
在python中,一个类的函数的第一个参数实际上是实例对象本身,就是所说的self(命名成什么并没有什么影响)。也就是说,所有python中的函数,只要函数在一个类里面,第一个参数都应该为self,如果不是self,那也是实例对象本身
比如:
这个例子说明self代表的是类的实例,代表当前对象的地址,self.class则指向类 ,即便是把prt方法中的self改成别的比如other,输出结果也是相同的
4、__init__()实例初始化
__init__():是类的一个专有方法,通常用来构造函数,在生成对象时调用
例:
class ATM():
# 类属性
money = 50000
country = "china"
bank = "gonghang"
# 这个area是形参
def __init__(self, area):
# 这个area是实例属性
self.area = area
# 方法
def get_money(self, money):
print(f'get money:{money}')
# 实例化
atm1 = ATM("hunan")
atm2 = ATM("hubei")
print(atm1.area, atm2.area)