PoEdu_Python_Lesson010_类的特性

没有写在方法里的变量的属性

使用类名即可访问

静态属性,属于类本身的

class UserInfo(object):
    name = "Poedu"

user=UserInfo()
user.name #可以
UserInfo.name #可以

user.name = ‘lala’

ususr.name改变了,而Info.name不变,其它定义的对象的name也不变

UserInfo.name = ‘lala’

所有对象的name都变为了lla

类里面的方法一定要有self属性,也就是方法的第一个参数为self

动态绑定

空类里面可以进行后绑定

class Demo(object):
    pass

d1 = Demo()
d1.user = 'root' #绑定了一个属性user
def foo(self):
    pass
d1.foo = foo
d1.foo #可以使用foo函数 绑定到了d1对象上

Demo.foo = foo #绑定到类上 这个类的所有对象都可共享得到

可以指定可绑定的

__slots__= (‘name’,’password’)

现在就只能动态绑定name和password

杜绝Python的动态绑定带来的风险

特性

希望一些属性能够隐藏,但是又希望无痛访问

比如,使用get和set的函数,能够不调用方法,而直接通过.属性进行访问,但是又希望保留方法中检查的功能

def get_name(self)
    return self.name

@property  #读特性(只允许读)
def name(self):
    return self.name

此时就可以这样访问了: user.name,看上去name是一个方法,但其实是一个方法,但是user.name = ‘lala’会报错,因为这是“读”特性,不允许写

@name.setter  #只写特性
def name(self,name):
    self.name = name

user.name = 'lala'

直接打印对象

比如有一个对象User,使用print(User)打印出里面的内容

正常的打印是输出main ,object…

方法如下:

def __str__(self):   #这是给用户看的
    return "__str__"   
print(User) #打印__str__
def __repr__(self):  #这是给程序员看的
    return "demo self"

u = User()

print(u)  #打印demo self

def __iter__(self): return self

def __next__(self): print(”)

可以用上面这两个做一个遍历

def __iter__(self):
    return self

def __next__(self):
    ret = random.randint(1..10000)
    if ret == 10000:
        raise StopIteration()  #停止遍历
    return ret

for in user:
    print(i)

但是,它也只能做个,它连下标操作都做不了,如果需要响应,则还需要__getitem__

def __getitem(self,item):
    return item

响应切片

def __getitem__(self,item):
    if isinstance(item,int):
        return "int"
    if isinstance(item,slice):
        return "切片"

写了很多的方法,原来的系统已经搭建完成,现在需要在每一个函数之前进行一个验证,如果函数多了,如果挨个的加,工作量会很大,但是在Python可以使用call来做

def __call__(self):
    print("call")

user = UserInfo()
user()  #调用call方法

示例

class CheckFoo(object)
    def __init__(self,foo):
        self.__foo=foo

    def __call__(self):
        print("验证")
        self.__foo()

def main():
    ckfoo = CheckFoo()
    ckfoo()

构造函数与析构函数

构造

def __init__(self):

析构

def __del__(self):

枚举

导入

form enum import Enum

大写的Enum才是我们要使用的那个

使用:

color = Enum(’color‘,(‘red’,’black’,gren))

首先是名称,然后跟一个元组

@unique  #去重操作:如果有重复的,会检查出来,并且不通过编译
class Color(Enum)
    RED = 1
    YEW = 2

错误处理

语法:

try:
    ...
        raise ..
except ValueError:  #ValueError错误类型
    ...
except ....:
    ...
finally :
    ...

示例

age = -1
while age == -1:
    temp = input("age:")
    try:
        age = int(age)
    except:
        age = -1

示例2

try:
    file = open(input("name"),'w')
    age = input("age") 
    file.close()  #如果上一行出错了,那么就没close了
except ValueError:
    print("输入错误")

可以在错误提示中使用file.close()这个函数,确保文件关闭,但是,一旦错误多了,那么就需要写很多close,可以使用finally:不管怎样都会执行

示例3:

file = open(input("name"),'w')
try:
    age = input("age") 
    file.close()  #如果上一行出错了,那么就没close了
except ValueError as e:
    print("输入错误",e)
finally:
    if file:
        file .close()

示例4:

file = open(input("name"),'w')
try:
    age = input("age") 
    file.close()  #如果上一行出错了,那么就没close了
except Exception as e: #接收所有错误,从继承体系中可知,多态..
    print("输入错误",e)
finally:
    if file:
        file .close()

大致继承体系:obeject > BaseException > Exception > …(各种类型的错误)

所以不写__init__的空类也不会出问题,就算其中什么都不写,它还是有一些方法,因为他继承自object

所以写一个Excption就能接收所有错误了

示例5

def div(n1,n2):
    if n2 == 0:
        raise ValueError("除数为0")
    return n1/n2

也可以新建一个我们自己的错误类,继承自Exception

作业

写一个模拟人生…锻炼使用类的继承

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值