python基础语法—day09(笔记)

主要内容:

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()

实例方法、类方法、静态方法图解:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值