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解释器检测到错误,触发异常(或者程序员自己触发异常)
- 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关),如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,是程序不会崩溃,这就是异常处理