鱼C论坛

 找回密码
 立即注册
查看: 1403|回复: 0

[技术交流] python学习笔记——第36-40课:类和对象

[复制链接]
发表于 2017-9-20 16:12:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 赤血危机 于 2017-9-20 16:15 编辑

类对象(相当于图纸) = 属性(静态)+方法(动态)
引用类对象即可创建实例对象(产品)。
定义类对象的方法
class xxx(这个Xxx的首字母要大写):
        (定义变量)
        (定义函数)
这样类就创建好了
使用类对象创建实例对象:
xxx = Xxx()
这样,xxx.类对象的变量和xxx.类对象的函数名就可以调用了

面向对象(OO)的三个特征:封装,继承,多态

在类里面定义变量之后,在类内引用或修改该变量需要前面加上【self.】,在类内定义函数时默认有且必须有第一个参数为self,例:
  1. class Person:
  2.     name = '赤血危机'
  3.     def print_name(self):
  4.         print(self.name)
  5.     def xiugai_name(self):
  6.         self.name = input('请输入名字')

  7. f = Person()
  8. f.xiugai_name()
  9. f.print_name()
复制代码


魔法方法__init__,可以在创建类的实例之时直接传参数进去使用,例如:
  1. class Person:
  2.     name = ''
  3.     def __init__(self,name):
  4.         self.name = name
  5.     def print_name(self):
  6.         print(self.name)

  7. f = Person('赤血危机')
  8. f.print_name()
复制代码


私有变量:前面直接定义函数内的变量都是公有变量,要定义私有变量,例如:
  1. class Person:
  2.     __name = '赤血危机' #在变量面前加【__】之后这个变量就是私有变量了
  3.     def getname(self):
  4.         return(self.__name) #此函数从类的内部获取私有变量并返回

  5. '''这时候用以下实例化代码:
  6. f = Person()
  7. f.__name或者f.name都是无法获取__name这个私有变量的'''
  8. f = Person()
  9. print(f.getname())
  10. print(f._Person__name)
  11. '''这两种方式可以获取私有变量'''
复制代码


子类继承父类的方法:
class 子类名(父类名):
只要子类名加了括号以后,就可以继承父类的变量和函数
在子类当中写与父类中有相同函数名的函数,会覆盖掉父类的函数调用(当然父类的函数不会被修改),而是调用新写的子类函数。
如果子类使用了与父类中存在的相同函数名,又不想把父类的函数盖掉,可以使用super方法
格式:  super().函数名()
Python支持多重继承,可以同时继承多个父类的方法和属性
格式 class 子类名(父类1,父类2,.......)
但是很容易出现不可预知的bug,谨慎使用

一些类相关的BIF(BIF调用的时候是不加前缀的):
issubclass(类1,类2)——检查类1是否为类2的子类(注意自身也被认为是自己的子类),类2可以为类名,也可以是元组,会检查类1是否为元组中每个元素的子类。如果是返回True,否则返回False。如果第二个参数不是类名或元组,会抛出TypeError异常。
isinstance(实例对象,类)——检查实例对象是否为某个类的实例对象,同样类可以是元组。返回True或者False。如果第一个参数不是实例对象,就会返回False。异常同上。如果某个实例对象是子类的实例对象,那么它也是父类的实例对象。
hasattr(类名,属性名)——检查该类中是否有该属性,注意属性名要用引号变成字符串,否则会报NameError异常。返回True或者False。
getattr(类名,属性名[,默认值])——返回该类中的该属性值。若该类中无该属性值,则返回默认值,否则报AttributeError异常。属性名同样需要引号。
setattr(类名,属性名,值)——在类中修改该属性的值,如果该属性不存在则创建一个新属性并赋值。属性名同样需要引号。
delattr(类名,属性名)——在类中删除该属性,若该属性不存在则报AttributeError异常。属性名同样需要引号。

property方法:用属性来调用方法去改变属性
格式:property(获取值方法,设置值方法,删除值方法 )
例:
  1. class Data:
  2.     def __init__(self,value = 0):
  3.         self.data = value
  4.     def get_data(self):
  5.         print('正在调用get_data方法')
  6.         return self.data
  7.     def set_data(self,value):
  8.         print('正在调用set_data方法')
  9.         self.data = value
  10.     def del_data(self):
  11.         print('正在调用del_data方法')
  12.         del self.data
  13.     x = property(get_data,set_data,del_data)#三个方法的顺序一定不能写错,这个x可以换成想要的名字

  14. d = Data()
  15. print(d.x)#只要用到d.x的值就会调用get_data方法
  16. d.x = 10#只要给d.x赋值就会调用set_data方法
  17. del d.x#只要删除d.x就会调用del_data方法
复制代码

这个方法的意义在于,只要修改property中的内容,即使修改了修改参数,获取参数和删除参数的方法名称,下面的程序就都不用改。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
霜满天 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 19:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表