A、封装
把属性定义为私有,即在属性前面添加两个下划线。例如:__smcs
B、继承
1、单继承
语法:class 子类名(父类名)
如果类中没有明确标注父类的时候,默认继承Object
类
父类的私有方法和私有属性不会被继承,更不能被子类访问
class Animal: # 父类
def __init__(self,color):
self.color = color
class Cat(Animal): # Cat继承Animal类
pass
cat = Cat('白色')
print(cat.color)
2、多继承
语法:class 子类名(父类名1, 父类名2...)
class A:
def a(self):
print('a')
class B:
def b(self):
print('b')
class C(A, B): # 多继承
pass
c = C()
c.a()
c.b()
3、重写父类方法
class A:
def a(self):
print('a')
class C(A):
def a(self): # 重写父类方法
print('c')
c = C()
c.a()
4、调用父类方法
class A:
def a(self):
print('a')
class C(A): # 多继承
def a(self): # 重写父类方法
super().a() # 调用父类方法
c = C()
c.a()
C、多态
class Animal:
def eat(self):
print("动物——吃")
class Cat(Animal):
def eat(self):
print("猫——吃")
class Dog(Animal):
def eat(self):
print("狗——吃")
def func(tmep):
tmep.eat()
dog = Dog()
cat = Cat()
func(dog)
func(cat)
D、类属性和实例属性
实例属性:实例.属性
类属性:属性 = 值
类属性写在类里面,方法的外面
它被所有类实例的对象所共有
类属性:
class A:
name = '三木成森' # 类属性
实例属性:
def __init__(self):
self.name = '三木成森' # 实例属性
公有的类属性,可以通过类名和实例对象访问
class A:
name = '三木成森'
def __init__(self, age):
self.age = age # 实例属性
a = A(20)
print(A.name) # 类名访问类属性
print(a.name) # 对象访问类属性
通常使用类名访问类属性
E、类方法和静态方法
在Python中,类方法和静态方法都属于类的方法。
1、类方法
语法:
class 类名:
@classmethod
def 类方法名(cls):
方法体
可以用@classmethod
修饰符来标识类方法
类方法的第一个参数为cls
,代表定义类方法的类,可以通过cls
访问类的属性。可以通过对象调用也可以使用类名调用,这两种方式没有任何区别。
类方法:
class Test:
number = 0
@classmethod
def set_Number(cls, number):
cls.number = number
test = Test()
print(test.number)
Test.set_Number(520)
print(test.number)
运行结果:
0
520
2、静态方法
使用@staticmethod标识的方法
class 类名:
@staticmethod
def 静态方法():
方法体
静态方法没有任何参数,由于没有self
参数,所以不能访问类的实例属性;静态方法也没有cls
参数所以也无法访问属性。静态方法跟它的类没有直接关系,只是起到类似于函数的作用。
class Test:
number = 0
@staticmethod
def static():
print('三木成森:静态方法')
test = Test()
test.static()
Test.static()
运行结果:
三木成森:静态方法
三木成森:静态方法
注意:使用类名不能访问实例属性或实例方法