# class Person2: 旧版定义类方式
# class Person2(): 旧版定义类方式
# 创建类
class Person(object):
# 默认初始化方法,系统自动调用,不需要初始化一些数据则可以生路
def __init__(self):
self.surename = "李"
def hello(self):
print("my surname is %s" % self.surename)
def say(self):
print("my age is %d" % self.age)
# 创建对象
p = Person()
p.hello()
# 给对象添加新的属性
p.age = 13
p.say()
说明:
初始化一个对象时,也可以附带一些参数:
class Person(object):
def __init__(self, skill):
self.surename = "李"
self.skill = skill
# 创建对象
p = Person("唱歌")
print(p.skill) # 唱歌
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法,比如 __init__()
。
__str__
方法默认返回一个字符串,用来描述对象的信息:
# 创建类
class Person(object):
def __init__(self, skill):
self.surename = "李"
self.skill = skill
def __str__(self):
return "这个人姓 %s,技能是:%s" % (self.surename, self.skill)
# 创建对象
p = Person("唱歌")
# 当类的实例化对象 拥有 __str__ 方法后,那么打印对象则 调用__str__ 。
print(p)
查看类的文档说明,也就是类的注释:
print(Person.__doc__)
删除对象时,默认调用 __del__()
方法:
class Person(object):
def __init__(self, skill):
self.surename = "李"
self.skill = skill
def __del__(self):
print("__del__方法被调用")
p = Person("唱歌")
del(p)
对象的属性一般称呼为实例属性,类属性则是类本身所拥有的属性,该属性会被所有的实例对象共享,在内存中只存在一个副本,类似java中的静态成员。
class People(object):
name = 'Tom' # 公有的类属性
__age = 12 # 私有的类属性
p = People()
print(p.name) # 正确
print(People.name) # 正确
print(p.__age) # 错误,不能在类外通过实例对象访问私有的类属性
print(People.__age) # 错误,不能在类外通过类对象访问私有的类属性
通过实例(对象)去修改类属性:
class People(object):
country = 'china' #类属性
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) # 实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country # 删除实例属性
print(p.country)
如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
类方法是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。
class People(object):
# 私有类属性
__country = 'china'
#类方法,用classmethod来进行修饰
@classmethod
def get_country(cls):
return cls.__country
p = People()
print(p.get_country()) #可以用过实例对象引用
print(People.get_country()) #可以通过类对象引用
类方法还有一个用途就是可以对类属性进行修改:
class People(object):
# 私有类属性
__country = 'china'
#类方法,用classmethod来进行修饰
@classmethod
def get_country(cls):
return cls.__country
@classmethod
def set_country(cls,country):
cls.__country = country
p = People()
print(p.get_country()) #可以用过实例对象访问
print(People.get_country()) #可以通过类访问
p.set_country('japan')
print(p.get_country())
print(People.get_country())
静态方法需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。
class People(object):
country = 'china'
@staticmethod
#静态方法
def get_country():
return People.country
p = People()
# 通过对象访问静态方法
p.get_contry()
# 通过类访问静态方法
print(People.get_country())
我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节:
class A(object):
def __init__(self):
print("这是 init 方法")
def __new__(cls):
print("这是 new 方法")
return object.__new__(cls)
A()
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。
__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例。
有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。