一. Python 类
class 关键字定义,内部可以定义属性和方法。 这是面型对象的基础
对象是类的具体实现。 就像猫与动物的关系一样,猫是动物的一种,猫具有动物的各种特征。
使用 对象 = 类 的方式来创建对象 cat = Animal();
类里的方法写在类的内部,类的属性既可以在类内部定义,也可通过对象去定义。
下面的例子是使用对象去定义类的属性
class Washer():
def wash(self):
print('我会洗衣服')
print(self)
hair = Washer()
print(hair) # <__main__.Washer object at 0x00000147B01194A8> 对象的内存地址
hair.height = 100
hair.describe = "海尔洗衣机"
print(f'海尔洗衣机的型号{hair.height}') # 海尔洗衣机的型号100
类内部使用类的属性:
在外部定义属性,但是在类内部方法使用属性
# 类内部获取属性
class Washer2():
def wash(self):
print(f"洗衣机宽度{self.width}")
hair_2 = Washer2()
hair_2.width = 100
hair_2.wash() # 洗衣机宽度100
在类的内部定义类的属性,需要使用类的构造函数 __init(self) self 就是类自己,相当于c语言的指针,一个指向自己的指针
个人觉得这种定义方式更适合去理解,毕竟属于先定义后使用。
# 构造函数
class Washer3():
def __init__(self,width,height):
self.width =width
self.height = height
def wash(self):
print(f"洗衣机3的宽度{self.width} 洗衣机3的高度{self.height}")
# 类似java重写string 方法
def __str__(self):
return '这是海尔洗⾐机的说明书'
hair_3 = Washer3(1,2)
hair_3.wash()
print(hair_3)
二. 继承
继承分为单继承和多继承
先介绍单继承:
单继承很容易理解,具体代码如下,子类继承父类后,不需要定义就具备父类的属性和方法
class DuanYu():
def __init__(self):
self.kongfu = '北冥神功'
def hit(self):
print(f"运用{self.kongfu} k.o 了某人")
class Prentice(DuanYu):
pass
prentice = Prentice()
prentice.hit() # 运用北冥神功 k.o 了某人
print(prentice.kongfu) # 北冥神功
多继承:当一个类具有多个父类的时候,默认使用第一个父类属性和方法
使用语法 class 子类(父类1,父类2,父类3)
代码:
# 多继承 当⼀个类有多个⽗类的时候,默认使⽤第⼀个⽗类的同名属性和⽅法
class DuanYu():
def __init__(self):
self.kongfu = '北冥神功'
def hit(self):
print(f"运用{self.kongfu} k.o 了某人")
class QiaoFeng():
def __init__(self):
self.kongfu = '打狗棍法'
def hit(self):
print(f"运用{self.kongfu} k.o 了某人")
class Prentice(DuanYu, QiaoFeng):
pass
prentice = Prentice()
prentice.hit() # 运用北冥神功 k.o 了某人
print(prentice.kongfu) # 北冥神功
继承与重写:通过重写子类与父类重名的方法和属性后,子类会默认调用自己重写后的方法和属性
通俗的讲,继承之后,子类没有的用父类的,子类有的用子类自己的,这点同java一样,但是java只有单继承
class DuanYu():
def __init__(self):
self.kongfu = '北冥神功'
def hit(self):
print(f"运用{self.kongfu} k.o 了某人")
class QiaoFeng():
def __init__(self):
self.kongfu = '打狗棍法'
def hit(self):
print(f"运用{self.kongfu} k.o 了某人")
# 重写 ⼦类和⽗类具有同名属性和⽅法,默认使⽤⼦类的同名属性和⽅法。
class Prentice(DuanYu, QiaoFeng):
def __init__(self):
self.kongfu = '打猫棍法'
prentice = Prentice()
prentice.hit() # 运用打猫棍法 k.o 了某人
子类重写后调用父类的方法:
需要在子类的方法中先调用父类的构造函数,否则,子类重名属性会覆盖父类的下·
# 子类调用父类的方法
class Prentice2(DuanYu, QiaoFeng):
def __init__(self):
self.kongfu = '打蛇棍法'
def hit(self):
self.__init__()
print(f"运用{self.kongfu} k.o 了某人")
def hit_qiao(self):
QiaoFeng.__init__(self)
QiaoFeng.hit(self)
def hit_duan(self):
DuanYu.__init__(self)
DuanYu.hit(self)
tudi = Prentice2()
tudi.hit()
tudi.hit_duan()
tudi.hit_qiao()
三. 私有属性
在Pthon中可以为某个类设置私有属性和私有方法,子类继承后,不可以使用父类的私有属性和方法
语法 __私有属性 __私有方法()
子类访问父类的私有属性会报错
class QiaoFeng():
def __init__(self):
self.kongfu = '降龙十八掌'
self.__girl = '阿朱'
class TuDi(QiaoFeng):
pass
tudi = TuDi()
print(tudi.kongfu)
# print(tudi.__girl) #AttributeError: 'TuDi' object has no attribute '__girl'
在Python中,⼀般定义函数名 get_xx ⽤来获取私有属性,定义 set_xx ⽤来修改私有属性值。
# 获取和修改私有属性值
class DuanYu():
def __init__(self):
self.kongfu = '六脉神剑'
self.__girl = '王语嫣'
# 获取私有属性
def get_girl(self):
return self.__girl
# 修改私有属性
def set_girl(self):
self.__girl = '木婉清'
class TuDi2(DuanYu):
pass
tudi2 = TuDi2()
print(tudi2.kongfu)
print(tudi2.get_girl()) # 王语嫣
tudi2.set_girl()
print(tudi2.get_girl()) # 木婉清