##创建一个类
类的名称: 标识符的命名规则,见名知意, 首字母大写, 然后遵从驼峰命名法
类的属性: 标识符的命名规则,见名知意 ,驼峰命名法
类的方法: 标识符的命名规则,见名知意, 驼峰命名法
格式:
class 类名(父类列表):
属性(变量)
行为(方法)
class Add(object):
# 属性
name = 'chu'
age = 20
weight = 130
# 方法(行为)
def eat(self):
print('%s真能吃'%self.name)
# 创建对象
# 格式: 变量名(对象名) = 类名(参数列表)
pp = Add()
# 访问属性
# 格式: 对象名.属性名
print(pp.name)
# 修改属性
pp.age = 200
print(pp.age)
# 访问方法
pp.eat()
构造方法
根据需要构造一个类出来
通常使用来做数据的初始化工作,在类创建的时候自动调用
class Add(object):
# 构造属性
def __init__(self,name,age,weight):
self.name = name
self.age = age
self.weight = weight
def eat(self):
print('%s真能吃'%self.name)
# 传入参数,跟构造的属性一一对应
pp = Add('chu',18,120)
# 访问属性和方法的结构不变
print(pp.name)
pp.eat()
析构函数
# 当对象释放的时候自动调用,释放函数
def __del__(self):
print("析构函数")
重写str
把属性所对应的值和属性一块输出来,方便用户的查看
在调用print打印对象时自动调用,是给用户用的,是一个描述对象的方法
class Add(object):
def __init__(self,name,age,weight):
self.name = name
self.age = age
self.weight = weight
def eat(self):
print('%s真能吃'%self.name)
# 重写str
def __str__(self):
# 初始化
return 'name = %s, age = %d, weight = %d'%(pp.name,pp.age,pp.weight)
pp = Add('chu',18,120)
print(pp)
print('name = %s, age = %d, weight = %d'%(pp.name,pp.age,pp.weight))
name = chu, age = 18, weight = 120
name = chu, age = 18, weight = 120
访问限制
属性前加两个下划线
需要通过set/get的方法进行操作
对象属性和类属性
class Person(object):
# 在类中的(非方法里)属于类属性(用类名来表示)
age = 100
def __init__(self,age):
# 在方法中的属性属于对象属性(用对象来调用)
self.age = age
print(Person.age)
p = Person(200)
# 对象属性的优先级高于类属性
print(p.age)
# 删除对象中的属性时,在调用会使用同名的类属性
del p.age
print(p.age)
# 以后千万不要对象属性与类属性重名,
# 因为 对象属性会屏蔽掉类属性,但是当删除对象属性后,又能使用类属性
释放私有属性 @property
把私有属性变为共有的,可以随意访问
class chu(object):
def __init__(self,name,age):
self.name = name
self.__age = age
# 类似于set/get方法,但是又好像是set/get的反操作
@property
def age(self):
return self.__age
@age.setter
def age(self,age):
self.__age = age
cc = chu('chu',23)
print(cc.name)
# 可以访问了
print(cc.age)
动态添加方法
from types import MethodType
# 定义空的类
class Person(object):
# __slots__用来限制属性, 值为元组形式
__slots__ = ("age","name","say")
# 创建对象
# 动态的给对象添加属性,这是动态语言的特性(灵活)
# 动态添加的属性只对当前对象生效, 对于类创建的对象没有用
p = Person()
p.age = 30
print(p.age)
# 动态创建方法
def say(self):
print("%s正在说话"%(self.name))
p = Person()
p.name = "tom"
# #动态的添加方法
p.say = say
# # 调用
p.say(p)
# 动态的添加函数
def say(self):
print("%s正在说话"%(self.name))
p = Person()
p.name = "tom"
p.say = MethodType(say,p)
p.say()
# 需要限制class的属性
# python是允许在定义class的时候,定义一个特殊的变量 __slots__变量,来限制class添加属性
p = Person()
p.hello = 10
print(p.hello)
p.age = 10
print(p.age)