内功心法果然和基本功没关系, 绕来绕去的确实很容易懵, 所以今天内容其实不多, 但是各种试错还是很多的
一, class 知识的继续补充
关于 class 的一些应该说明的本质问题
还是以狗狗为例
- class Dog:
- '这里一般放置关于这个类的描述, 还是应该专业点, 这是一个狗狗的类'
- def __init__(self, name, gender, age, type):
- self.name = name
- self.gender = gender
- self.age = age
- self.pinzhong = type
__init__函数是不能又返回值的, 如果你强行返回, 系统会告诉你你错了
没有 return
下面就可以定义一些关于狗的方法了
- def xiaogou(self):
- #这里你会发现当你定义了一个函数之后, class 会自动要求把你在__init__中的 self 作为变量传输进去
- print('%s 的狗才能生小狗'%self.gender)
- def jiao(self):
- print('%s 正在汪汪汪叫'%self.name)
- def chishi(self):
- print('%s 岁之后狗才会吃屎'%self.age)
- def yang(self):
- print('%s 容易掉毛'%self.pinzhong)
- dog1 = Dog('旺财','woman','5','金毛')
这里这句其实相当于在执行类 Dog, 输入参数的过程和函数没有区别
上面这一句做的事情其实和下面这句是一样的
dog1 = Dog.__init__(dog1,'旺财','woman','5','金毛')
当你在执行 Dog 的时候其实就是__init__方法, 他会默认将 dog1 传给 self
这一步就是对象的实例化的过程
- print(dog1)
- print(dog1.__dict__)
- {
- 'pinzhong': '金毛', 'gender': 'woman', 'age': '5', 'name': '旺财'
- }
你会发现当一个类实例化之后, 功能属性 (即函数) 不在上述字典中
但是 Dog 类里面还是在的哦
- print(Dog.__dict__)
- {
- '__module__': '__main__', 'chishi': <function Dog.chishi at 0x000001F3123A4598>,
- '__init__': <function Dog.__init__ at 0x000001F3123A40D0>, '__dict__': <attribute '__dict__' of 'Dog' objects>,
- '__doc__': '这里一般放置关于这个类的描述, 还是应该专业点, 这是一个狗狗的类', '__weakref__': <attribute '__weakref__' of
- 'Dog'objects>, 'jiao': <function Dog.jiao at 0x000001F3123A4510>, 'yang': <function Dog.yang at 0x000001F3123A4620>,
- 'xiaogou': <function Dog.xiaogou at 0x000001F3123A4488>
- }
此时你是否看到, 我们在输出对象的字典的时候是只有数据属性部分的
那么如何调用功能属性呢
先是使用老式方法开始
Dog.__dict__['yang'](dog1)
准确的输出了: 金毛容易掉毛
但是这种方法太 low 了, 现在的 class 类可以帮我们实现
dog1.yang()
这里也是输出了: 金毛容易掉毛
但是你会发现, yang 这个函数是需要你传递一个参数 self 的
这里传递参数由 class 协助完成, 会默认将__init__方法形成的对象传入其中
如果使用老方法不传参数会怎样呢
Dog.__dict__['yang']()
这个时候就会报错: TypeError:yang() missing 1 required positional argument: 'self'
说你没传参数
还有就是关于 class 里面的作用域问题
之前我们提到, 如果个变量找不到自己的值, 会不停往外找, 直到找到为止, 但是在 class 中
如果找到 class 的最外层还没找到就不会找了
重新来一个类验证一下吧
- dang = '党'
- class Chinese:
- pep = '党'
- print(Chinese.dang) #输出: 党
但是我们把党注释掉, 放到 class 外面
print(Chinese.dang)
此时会报错: AttributeError: type object 'Chinese' has no attribute 'dang'
二, 类的增删改查
类的增删改查
- class Chinese:
- 'Chinese 类, 增删改查测试'
- country = 'China'
- def __init__(self,name):
- self.xingming = name
- def play(self,ball):
- print('%s 正在打 %s'%(self.xingming,ball))
类的增加, 首先是数据属性的增加
- Chinese.goverment = '党'
- p1 = Chinese('alex')
- print(p1.country , p1.goverment)
输出: China 党 完成增加新的数据属性的增加
类的增加, 关于增加功能属性的部分
- def test(self):
- print('这是测试部分的内容')
- Chinese.test_add = test
- p1.test_add() #这是测试部分的内容
删除类的功能, 我们就删除掉上面刚才新增的类
- del Chinese.test_add
- del Chinese.goverment
- print(Chinese.__dict__)
- {
- '__init__': <function Chinese.__init__ at 0x00000200A8DC40D0>, '__weakref__': <attribute '__weakref__' of 'Chinese' objects>,
- 'play': <function Chinese.play at 0x00000200A8DC4488>, 'country': 'China', '__doc__': 'Chinese 类, 增删改查测试',
- '__dict__': <attribute '__dict__' of 'Chinese' objects>, '__module__': '__main__'
- }
此时刚才新增的两个数据属性和功能属性就都删除掉了
关于类的修改, 其实修改的方式和新增的方式是类似的
- Chinese.country = '小日本'
- def eat_food(self , food):
- print('%s 在吃 %s'%(self.xingming , food))
- Chinese.play = eat_food
- print(p1.country) #输出: 小日本
- p1.play('xiang')
输出: alex 在吃 xiang
查看, 就直接用类. 属性名直接调用查看就可以了
三, 实例对象的增删改查
- # 实例对象的增删改查
- # class Dog:
- # '测试实例对象的增删改查, 包括他的功能属性的修改'
- # def __init__(self,name):
- # self.name = name
- #
- # def wang(self,people):
- # print('%s 正在冲着 %s 汪汪叫'%(self.name , people))
来源: http://www.bubuko.com/infodetail-3460513.html