面向对象:更加符合人民思考习惯的思想,从执行者变成了指挥者
设计类只关心3样东西
说明
类名:首字母大写,遵守标识符规则 属性:遵守标识符规则 行为(功能、方法、函数):遵守标识符规则
设计类
类名:Person
属性:name age sex height weight
行为:搬砖、盖房子
创建类
格式
class 类名(父类名):
属性&行为
说明
class:表明这是一个类
类名:类的名字
():父类集合的开始和结束 父类名:父类的名字,定义的类继承自父类,可以不写,默认是object。object是所有类的直接或间接父类
代码
class Person(object):
pass
# 类
class Person(object):
pass
格式
对象名 = 类名(参数列表)
说明
参数列表:为了后面给属性进行赋值的
实例化代码
per1 = Person()
print(per1)
per2 = Person()
print(per2)
对象方法
定义:如Person类中
调用方式:通过实例对象调用
调用格式:对象名.方法名(参数列表)
特性:在对象方法内部可以引用类内部的任何属性和方法 注意:定义对象方法的第一个参数必须是self,其余参数按顺序排列,调用对象方法(函数)时忽略self self:代表一个对象,哪个对象调用的对象方法,那么在该方法中self就代表哪个对象
类方法
定义:如Person类中
调用方式:用类名调用(也可以使用对象调用,但是很少这么用)
调用格式:类名.方法名(参数列表)
特性:在类方法内部可以引用类的属性和方法 注意:定义对象方法的第一个参数必须是cls,其余参数按顺序排列,调用类方法(函数)时忽略cls cls:代表当前对象的类的类名
静态方法
定义:如Person类中
调用方式:类和实例对象均可调用
调用格式:类名/对象名.方法名(参数列表)
特性:无论用类调用还是用实例对象调用,都无法获取到内部的属性和方法,完全独立的一个方法 作用:常用作工具方法
代码
class Person(object):
# 定义对象方法
def run(self):
print("----------------run", self)
#对象方法内部调用其他对象方法
self.eat("banana")
# 对象方法内部调用其他类方法
self.talk("nice")
def eat(self, food):
print("----------------eat", food)
# 定义类方法
@classmethod
def say(cls):
print("----------------say", cls)
# 在类方法内部调用其他类方法
cls.talk("handsome")
@classmethod
def talk(cls, word):
print("----------------talk", word)
# 定义静态方法
@staticmethod
def play():
print("----------------play")
# 实例化一个对象
per = Person()
print(per)
print(Person)
# 调用对象方法
per.run()
per.eat("apple")
# Person.run() #报错
# Person.run(per) #类调用对象方法,需要传递一个对象,实参对象会给对象方法中的self赋值。注意帅的人基本不这么用
# 调用类方法
Person.say()
Person.talk("good")
# per.say() #使用实例对象调用了类方法,最好不要这么用
print("-------------------------------")
per.run()
Person.say()
print("-------------------------------")
per.play()
Person.play()
定义
class Person(object):
# 定义类属性
# 当多个类的对象的属性值需要相同时可以使用类属性
name = "lilei"
age = 18
sex = "男"
调用
可以通过类调用,也可以通过对象调用
使用
# 实例化对象时,每一个对象的属性值都相同
per1 = Person()
per2 = Person()
#通过对象方法类属性 对象名.类属性名
print(per1.name, per1.age, per1.sex)
print(per2.name, per2.age, per2.sex)
# 修改对象属性值,如果对象属性不存在则变为增加对象属性
per1.name = "liudh"
per2.name = "daol"
print(per1.name, per2.name, Person.name)
问题
使用类创建的所有对象的属性初始值都是一样的
需求
类创建的多个对象的属性的初始值是不同的
定义
class Person(object):
# 类属性
country = "中国"
# 构造方法:在使用类创建实例对象时自动调用,目的是初始化对象的内容
def __init__(self, name, age, sex):
# 定义对象属性
# 只能对象调用
self.name = name
self.age = age
self.sex = sex
使用
# 创建对象时给每个对象的属性进行赋值
per1 = Person("daol", 45, "男")
per2 = Person("liudh", 55, "男")
print(per1.name)
print(per2.name)
# print(Person.name) # 类中没有name属性,且类无法调用对象属性
__new__
方法
说明:是一个类方法,在使用类实例化对象时,在__init__
之前调用,在堆内存中开辟空间,并返回空间的首地址,该片内存空间就代表创建的对象(混沌对象)
使用:以后是使用__new__
实现单例类,否则基本不会使用
作用
释放一些不必要的内存
使用
class Person(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def __del__(self):
print("-----del-----")
调用:在释放对象时自动调用
per = Person("liudh", 55, "男")
# 释放对象
del per
print(per)
# num = 10
# #释放掉后面的内容
# del num
# print(num)