一、私有属性和方法
在实际开发中,对象的某些属性或方法希望只在对象的内部被使用,不希望在外部被访问到,我们可以把这些属性或方法定义为私有。
语法:
在定义属性或方法时,在属性名或方法名前添加两个下划线,这样就可以定义私有属性和方法。
代码示例如下:
class Wowen:
# 私有属性
__age = ''
name = ''
def __init__(self, name):
self.name = name
self.__age = 18
def showName(self):
print('我的姓名是:%s' % self.name)
# 私有方法
def __secret(self):
print('我的年龄说:%d' % self.__age)
xiaomei = Wowen('小美')
print(xiaomei.name)
xiaomei.showName()
# 私有属性 外部不能访问
# print(xiaomei.__age)
# 私有方法 外部不能访问
# xiaomei.__secret()
输出:
小美
我的姓名是:小美
二、面向对象的三大特性
封装:根据职责将属性和方法封装到一个抽象类中
继承:实现代码的复用,相同的代码不需要重复编写
多态:不同的对象调用相同的方法,产生不同的执行结构,增加代码的灵活度。
三、继承
语法:
class 类名(父类名):
pass
子类继承自父类,可以直接享有父类中已经封装好的属性和方法,不需要再次开发。
子类中应该根据职责,封装子类特有的属性和方法。
代码示例如下:
class Animal:
name = ''
age = ''
def eat(self):
print('吃东西')
class Dog(Animal):
def bark(self):
print('够叫')
class Cat(Animal):
def catch(self):
print('猫抓')
方法重写:当父类的方法实现不能满足子类需要时,子类可以对方法进行重写。
代码示例如下:
# coding=utf-8
class Animal:
name = ''
age = ''
def eat(self):
print('吃东西')
class Dog(Animal):
def bark(self):
print('够叫')
# 方法重写
def eat(self):
print('狗吃骨头')
class Cat(Animal):
def catch(self):
print('猫抓')
wancai = Dog()
wancai.eat()
输出:
狗吃骨头
super:super就是使用super类创建出来的对象,最常用的场景就是在重写父类方法时,调用在父类中封装的方法实现。
# coding=utf-8
class Animal:
name = ''
age = ''
def eat(self):
print('吃东西')
class Dog(Animal):
def bark(self):
print('够叫')
# 方法重写
def eat(self):
# 调用父类的方法
super().eat()
print('狗吃骨头')
class Cat(Animal):
def catch(self):
print('猫抓')
wancai = Dog()
wancai.eat()
输出:
吃东西
狗吃骨头
多继承:子类可以拥有多个父类,并且具有所有父类的属性和方法。
语法:
class 子类名(父类名1, 父类名2...)
pass
代码示例如下:
class Father:
def fatherMoney(self):
print('父亲的钱')
class Mother:
def motherMoney(self):
print('母亲的钱')
class Son(Father, Mother):
pass
xiaom = Son()
xiaom.fatherMoney()
xiaom.motherMoney()
输出:
父亲的钱
母亲的钱
四、多态
多态具体就是不同的子类对象调用相同的父类方法,产生不同的执行结果。
代码示例如下:
class Animal:
def eat(self):
pass
class Dog(Animal):
def eat(self):
return "狗啃骨头"
class Cat(Animal):
def eat(self):
return '猫吃鱼'
class test:
# 定义一个方法 父类对象作为参数
def show(self, animal):
print('动物吃的行为:%s' % animal.eat())
dog = Dog()
mytest = test()
# 传入子类的对象参数
mytest.show(dog)
输出:
动物吃的行为:狗啃骨头
五、类方法和静态方法
类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性或者调用其他的类方法。
类方法
语法:
@classmethod
def 类方法名(cls):
pass
代码示例如下:
class Tool:
count = 0
@classmethod
def show_tool_count(cls):
cls.count += 1
print('工具被调用的次数:%d' % cls.count)
# 直接使用类名调用类方法
Tool.show_tool_count()
Tool.show_tool_count()
输出:
工具被调用的次数:1
工具被调用的次数:2
静态方法:
在开发时我们不需要访问实例属性或者调用实例方法也不需要访问类属性或调用类方法,可以把这个方法封装成一个静态方法。
语法:
@staticmethod
def 静态方法名():
pass
通过类名.静态方法来调用。
代码示例如下:
# coding=utf-8
class Tool:
# 静态方法
@staticmethod
def show():
print('静态方法')
# 直接使用类名调用静态方法
Tool.show()
输出:
静态方法