类的创建和调用
class Cat:
def eat(self):
# 哪一个对象调用的方法,self就是哪一个对象的引用
print("小猫爱吃鱼")
def drink(self):
print("小猫爱喝水")
# 创建对象
tom = Cat()
# 调用方法
tom.eat()
tom.drink()
对象仍然遵循引用,通过%x可以打印16进制的内存地址
print("addr = %x" % addr)
print("addr_t = %x" % addr_t)
使用类名()创建对象时,会自动调用__init__方法,__init__可以自己重写
一个对象的属性可以是另一个类创建的对象
class Cat:
def __init__(self, new_name):
print("这是一个init方法")
self.name = new_name
__del__方法会在对象被销毁前调用
class Cat:
def __init__(self):
print("这是一个init方法")
self.name = "tome"
def __del__(self):
print("baibai")
tom = Cat()
print(tom.name)
# 如果调用了del方法,那么__del__方法会在del方法调用前调用
# 如果没有调用,__del__方法会在程序结束前调用
del(tom)
print("*" * 50)
==用来判断两个引用变量的值是否相等
is用来判断两个变量的引用是否相同
私有属性和私有方法
如果在定义属性或者方法时,在前面添加__,就可以定义为私有属性和私有方法,只能在类内部访问
但是Python中并没有真正的私有
_类名.__属性 可以访问私有属性
继承
class Animal:
def eat(self):
print("吃")
def drink(self):
print("喝")
def run(self):
print("跑")
def sleep(self):
print("睡")
# 继承Animal的所有属性和方法
class Dog(Animal):
def bark(self):
print("咬")
dog = Dog()
dog.eat()
子类可以继承父类的属性和方法,子类可以根据自己的特性封装特有的属性和方法
父类派生出来的子类又派生出来的子类仍然可以调用基类的属性和方法
但是,子类不能直接访问父类的私有属性和方法,只能通过父类的公有方法间接操作父类的私有属性和方法
方法的重写
class Animal:
def bark(self):
print("汪汪汪")
class Dog(Animal):
# 重写方法时,直接用同名函数编写
def bark(self):
print("嘿嘿嘿")
dog = Dog()
dog.bark()
对父类方法扩展
就是在实际开发过程中,父类的方法不能满足需求,但是也得使用时,我们就需要对原来的方法就行扩展
class Animal:
def bark(self):
print("汪汪汪")
class Dog(Animal):
def bark(self):
print("狗要叫了")
# 通过super()来调用原本在父类封装的方法
# 其余位置根据自己的需求,编写其他代码就好了
super().bark()
print("heiheih")
dog = Dog()
dog.bark()
多继承
一个子类可以继承多个父类的属性和方法
注意:使用多继承时,父类尽量避免出现相同的方法或者属性
如果存在同名,会自动调用继承顺序靠前的父类方法,可以通过 子类.__mro__属性得到方法的搜索顺序
class A:
def bark(self):
print("汪汪汪")
class B:
def drink(self):
print("喝水")
# 继承多个父类
class C(A, B):
# 当有代码需要之后写时,用pass占位,不影响代码运行调试
pass
small_c = C()
small_c.drink()
small_c.bark()
类属性
类属性就是给类对象定义的属性
类属性不会用于记录具体对象的特征
class Dog(object):
# 定义一个类属性
count = 5
def __init__(self, name):
self.name = name
可以使用类名.属性或者对象名.属性(不推荐)得到属性
但是对象.属性=值进行赋值时,并不会改变类属性的值,只会对当前对象添加一个属性,可以通过这种方式获取值,不能修改值
类方法
class Demo(object):
# 定义类方法时,需要使用classmethod修饰符表明,第一个参数是cls
@classmethod
def class_mthod(cls):
print("hello world")
静态方法
如果一个函数不需要访问类属性或者实例属性,因此他不需要指定self参数
class StaticMethod(object):
# 静态方法需要staticmethod修饰
@staticmethod
def run():
print("hello world")
# 可以直接用类名.方法名调用
总结案例
class Game(object):
top_score = 0
def __init__(self, name):
self.name = name
@staticmethod
def show_help():
print("帮助信息:")
@classmethod
def show_top_score(cls):
print("历史最高分是:%d" % cls.top_score)
def start_game(self):
print("%s开始游戏" % self.name)
# 调用静态方法
Game.show_help()
# 调用类方法
Game.show_top_score()
# 实例对象,调用实例方法
palyer_one = Game("player01")
palyer_one.start_game()