类的成员和异常处理

1.私有成员

  • 类中的私有成员
    • 在属性名称前加__可将该属性变成私有属性
    • 对于类的公有静态属性,类的外部,类的内部,类的派生类都可以访问
    • 私有静态属性:类的外部不能访问,类的派生类不能访问,只有在类的内部才能够访问
  • 对象私有属性
    • 类的内部可以使用
    • 派生类中也不可访问
    • 类的外部也不能访问
  • 私有属性应用场景
    • 如果想设定一些私有的或者是不想让类外面用到的密码,加密方式等,可设定为私有属性
    • 可通过在私有成员前面加上_类名这种方式进行访问,但是千万不要这么访问!!!
# class A:
#     __girlnum = '1个'
#

# print(A.__dict__)

# python中所有的私有成员: 就是在私有成员前面加上 _类名而已.
# print(A._A__girlnum)  # 千万不要这么去访问!!!

2.类方法和静态方法

  • 实例方法
    • 定义 ; 第一个参数必须是实例对象,该参数名一般约定位"self" ,通过它来传递实例的属性和方法(也可以传类的属性和方法
    • 调用:只能由实例对象调用
  • 类方法
    • 定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一般约定为"cls",通过它来传递类的属性和方法(不能传实例的属性和方法)
  • 静态方法
    • 定义:使用装饰器@staticmethod.参数随意,没有self和cls参数,但是方法体重不能使用类或实例的任何属性和方法
    • 调用:实例对象和类对象都可以调用
  • 双下方法
    • 定义:双下方法是特殊方法,它是解释器提供的,有双下划线加方法名加双下换线的具有特殊意义的方法,双下方法主要是python源码程序员使用的
      定义一个Student类,我要统计学生的个数.

class Student:

num = 0

def init(self,name):

self.name = name

self.count()

@classmethod

def count(cls):

cls.num = cls.num + 1

@classmethod

def get_num(cls):

return cls.num

ly = Student('李业')

sq = Student('申强')

sq1 = Student('申强')

sq2 = Student('申强')

sq3 = Student('申强')

sq4 = Student('申强')

print(Student.get_num())

num = 1

for i in range(4):

num += 1

for i in range(6):

pass

print(num)

3.方法伪装为属性

  • property是一种特殊属性,访问它时会执行一段功能(函数)然后返回
  • 应用场景: 当一个类的函数定义成特性以后,对象再去使用的时候该函数的时候,根本无法察觉到是执行了一个函数后计算出的据俄国,这种特性遵循了统一访问原则
#bmi值测试人体体脂:

# class Bmi:
#
#     def __init__(self, name, weight, height):
#
#         self.name = name
#         self.weight = weight
#         self.height = height
#
#     def bmi(self):
#         return self.weight / self.height**2
#
# tb = Bmi('太白',80, 1.75)
# print(tb.bmi())

# 我们要让bmi方法伪装成属性,虽然在代码级别没有提升,但是看起来更合理.

# class Bmi:
#
#     def __init__(self, name, weight, height):
#
#         self.name = name
#         self.weight = weight
#         self.height = height
#
#     @property
#     def bmi(self):
#         return self.weight / self.height**2
#
# tb = Bmi('太白',80, 1.75)
# print(tb.bmi)
# print(tb.weight)




class Foo:

    def __init__(self,name):
        self.name = name
    @property
    def aaa(self):
        print('get的时候运行我啊')

    @aaa.setter
    def aaa(self,v):
        print('修改的时候执行我')

    @aaa.deleter
    def aaa(self):
        print('删除的时候执行我')
obj = Foo('alex')
# print(obj.name)
# obj.name = 'dsb'
# del obj.name
# print(obj.name)
# obj.aaa
# obj.aaa = '太白'
# print(Foo.aaa)
# del obj.aaa

# 设置属性的另外一种写法:


# class Foo:
#
#     def get_AAA(self):
#         print('get的时候运行我啊')
#
#     def set_AAA(self,value):
#         print('set的时候运行我啊')
#
#     def delete_AAA(self):
#         print('delete的时候运行我啊')
#
#
#     bbb = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
#
# f1=Foo()
# f1.bbb
# f1.bbb='aaa'
# del f1.bbb

4.isinstance issubclass type.py

  • isinstance(a,b) : 判断a是否是b类(或者b的派生类)的实例化对象
  • issubclass(a,b) : 判断a类是否是b类(或者b类的派生类)的派生类
  • 元类:type
    • type元类是获取该对象从属于的类,而type类比较特殊,python原则是:一切皆对象,其实类也可以理解为对象.而type元类又称为构件类,python中大多数内置的类(包括object)以及自己定义的类都是type元类创造的
    • object是type类的实例,而type类是object类的子类

print(isinstance(s1, Iterable))

type 到底是什么?

type 元类 python中一切皆对象 , 一个类也是一个对象.

么这个(类)对象肯定是由类实例化出来的.

python中你创建的所有类,以及大部分list str等等这些类,都是从type元类实例化得来的.

python中继承object类都是新式类.

object 也是由type元类实例化得来的.

type


### 5.异常处理

- 语法错误:必须改正,不应该出现
- 逻辑错误:输入空格,非法字符等,其实if条件判断语句就是简单的异常处理
- 异常
  - 异常发生之后,异常之后的代码就不执行了\
- 异常处理
  - python解释器检测到错误,触发异常(或者程序员自己触发异常)
  - 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,是程序不会崩溃,这就是异常处理
posted @ 2019-07-11 18:13  恰蜜小嘴  阅读(144)  评论(0编辑  收藏  举报