主要内容:
1.把对象当成字典来操作
不能直接把一个对象当字典来使用,[ ]语法会调用对象的__setitem__方法
1)以下方法会出错,TypeError: ‘Person’ object does not support item assignment
class Person(object):
# 在创建对象的时候会自动调用这个方法
def __init__(self, name, age):
self.name = name
self.age = age
p=Person("张三",18)
print(p.__dict__)
p['name']='李四'
2)[ ]语法会调用对象的__setitem__方法
class Person(object):
# 在创建对象的时候会自动调用这个方法
def __init__(self, name, age):
self.name = name
self.age = age
def __setitem__(self, key, value):
print("__setitem__方法被调用了")
p=Person("张三",18)
print(p.__dict__)
p['name']='李四'
3)如何修改字典里的值?
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __setitem__(self, key, value):
self.__dict__[key]=value
p=Person("张三",18)
print(p.__dict__)
p['name']='李四'
print(p.__dict__)
# {'name': '张三', 'age': 18}
# {'name': '李四', 'age': 18}
4)获取字典里的值,会调用__getitem__方法
class Person(object):
# 在创建对象的时候会自动调用这个方法
def __init__(self, name, age):
self.name = name
self.age = age
def __setitem__(self, key, value):
self.__dict__[key]=value
def __getitem__(self, item):
return self.__dict__[item]
p=Person("张三",18)
print(p['name']) #张三
2.类属性和对象属性
这个属性定义在类里,函数之外,我们称之为类属性。
类属性可以通过类对象和实例对象来获取,类属性在类对象中可以找到;如果实例对象里没有找到类属性,就会往上找(在类对象中找)
class Student(object):
type='学生'
def __init__(self, name, age):
self.name = name
self.age = age
p=Student("张三",18)
#通过类对象来获取
print(Student.type)
#通过实例对象来获取
print(p.type)
这种方法并不是修改类属性,而是给实例对象新增了一个对象属性
p.type='student'
print(p.type)
那如何修改类属性呢?类属性只能通过类对象来修改,实例对象无法修改类属性
Student.type='student'
print(Student.type)
print(p.type)
# student
# student
3私有属性和方法的使用
(1)以两个下划线开始的变量为私有变量
私有变量不能直接被获取
class Student(object):
type='学生'
def __init__(self, name, age):
self.name = name
self.age = age
self.__money=1000 #私有变量
p=Student("张三",18)
print(p.__money)
# AttributeError: 'Student' object has no attribute '__money'
获取私有变量的方式:
1)使用 对象._类名__私有变量名来获取
class Student(object):
type='学生'
def __init__(self, name, age):
self.name = name
self.age = age
self.__money=1000 #私有变量
p=Student("张三",18)
print(p._Student__money) #1000
私有变量在类里面可以访问
class Student(object):
type='学生'
def __init__(self, name, age):
self.name = name
self.age = age
self.__money=1000 #私有变量
def test(self):
self.__money+=100
p=Student("张三",18)
p.test()
print(p._Student__money) #1100
2)定义get和set方法来获取(接口函数)
import datetime
class Student(object):
type='学生'
def __init__(self, name, age):
self.name = name
self.age = age
self.__money=1000 #私有变量
def get_money(self):
print('在{}显示了余额'.format(datetime.datetime.now()))
return self.__money
def set_money(self):
print('余额被修改了')
self.__money=100
p=Student("张三",18)
p.get_money()
p.set_money()
(2)以两个下划线开头的函数为私有函数,在外面无法调用
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __test(self):
print('我是test函数')
p=Student("张三",18)
p._Student__test() #我是test函数
4.类方法和静态方法
(1)对象方法可以直接使用实例对象.方法名(参数)调用。使用实例对象名.方法名(参数)调用的方式,不需要传递self,对自动将对象名传递为self
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def test(self,exam): #对象方法有个参数self,指的是实例对象
print(self.name,'正在',exam,sep='')
p=Student("张三",18)
p.test('考试') #张三正在考试
(2)对象方法还可以使用类对象名.方法名(参数)调用,这种方式不会自动给self传参,需要手动地指定self
p=Student("张三",18)
Student.test(p,'考试') #张三正在考试
(3)如果一个方法里没有用到实例对象的任何属性,可以将这个方法写成static,静态方法
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def test(self,exam):
print(self.name,'正在',exam,sep='')
@staticmethod
def test1():
print('hello')
p=Student('张三',20)
#静态方法:没有用到实例对象的任何属性
Student.test1()
p.test1()
class Calc():
@staticmethod
def add(a,b):
return a+b
print(Calc.add(3,4))
(4)如果这个函数只用到了类属性,我们可以把它定义成为一个类方法。类方法会有一个参数cls,也不需要手动传参,会自动传参,cls指的是类对象,cls==Student—>True
class Student(object):
type='学生'
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def test(cls):
#类方法会有一个参数cls,也不需要手动传参,会自动传参
print(cls.type)
print('打羽毛球')
p=Student('张三',20)
Student.test()
p.test()
实例方法、类方法、静态方法图解: