细分类的组成成员
细分类的组成成员
成员有以下:
1、字段: 静态字段 普通字段
2、方法: 静态方法 类方法 普通方法
3、特性/属性 普通特性
成员修饰符 修饰成员
公有的:没有限制
私有的:以__开头 仅仅内部可以访问,不能被继承,仅自己可访问。私有的成员可通过公有的成员间接访问
何时用类调用,何时用对象调用?
类调用: 无self
对象调用:self
结论:
1、静态字段和静态方法和类方法通过类来访问,普通字段和方法通过对象来访问
2、静态方法,使用@staticmethod来装饰
3、类方法,使用@classmethod来装饰
4、属性(特性),使用@property来装饰,定义的时候类似普通方法一样,但调用的时候像普通字段一样
5、属性的getter和setter,通过@property来装饰的方法return来getter,之后通过@方法名.setter装饰的方法来setter
一些特殊的成员:
init 构造方法,创建对象时调用
del 析构方法,销毁对象时调用
call 对象() 调用
getitem 对象[] 来调用
setitem 对象[] = xxx 来调用
delitem del 对象[] 来调用
dict 列出所有的成员 用途:在表单对象中获取表单所有的字段
参考字典对象dict
str 类似java中的toString方法,直接打印对象输出的就是该方法的返回值
方法部分
class A:
company_name = 'mcsq' # 静态变量(静态字段)
__iphone = '1353333xxxx' # 私有静态变量(私有静态字段)
def __init__(self,name,age): #特殊方法
self.name = name #对象属性(普通字段)
self.__age = age # 私有对象属性(私有普通字段)
def func1(self): # 普通方法
pass
def __func(self): #私有方法
print(666)
@classmethod # 类方法
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print('类方法')
@staticmethod #静态方法
def static_func():
""" 定义静态方法 ,无默认参数"""
print('静态方法')
@property # 属性
def prop(self):
pass
A.a_func(66)
obj = A()
obj.a_func(777) # 对象也可以调用类方法,但是会自动将其从属于的类名传给cls
类的私有成员
# 类中的私有成员: 私有类的静态属性, 私有对象属性,私有方法
# 对于类的公有静态属性,类的外部,类的内部,派生类都可以访问.
# 私有静态属性: 类外部不能访问,类内部可以访问 ,派生类不可访问
# 对象的私有属性# 类的内部可以使用 ,类的外部不能访问 ,派生类中也不可访问
# 如果想设定一些私有的或者是不想让类外面用到,密码,加密方式,等设置成私有成员.
# 拓展: 私有成员除了在类内部,当真访问不到么?
# python中所有的私有成员: 就是在私有成员前面加上 _类名而已.
# print(A._A__girlnum) # 千万不要这么去访问!!!
类方法与静态方法
# 类方法
# @classmethod # 类方法: 由类名直接调用的方法,他会自动的将类名传给cls
# 对象也可以调用类方法,但是会自动将其从属于的类名传给cls
# @staticmethod 静态方法: 不依赖于类,也不依赖于对象,他就是一个普通的函数放置于类中是结构更加清晰与合理.
属性
# 我们要让类方法伪装成属性,虽然在代码级别没有提升,但是看起来更合理.
# @property
# def aaa(self):
# print('get的时候运行我啊')
# @aaa.setter
# def aaa(self,v):
# print('修改的时候执行我')
# @aaa.deleter
# def aaa(self):
# print('删除的时候执行我')
isinstance issubclass
# isinstance(obj,N): 判断 obj对象 是由N类(N的派生类)实例化的对象 返回 True.
# issubclass(M,N) 判断是M类是N类的子孙.
# type 到底是什么?
# type 元类 python中一切皆对象 , 一个类也是一个对象.
# 么这个(类)对象肯定是由类实例化出来的.
# python中你创建的所有类,以及大部分list str等等这些类,都是从type元类实例化得来的.
# python中继承object类都是新式类.
# object 也是由type元类实例化得来的.
# type
函数vs 方法
# 1 通过函数名可以大致判断
# print(func) # <function func at 0x00000000005D1EA0> 函数
# obj = A()
# print(obj.func) # <bound method A.func of <__main__.A object at 0x0000000001DE1CF8>> 方法
# 2. 通过types模块去验证
# from types import FunctionType #返回bool True就是函数
from types import MethodType
# 类名调用func 就是一个函数
# print(isinstance(A.func, FunctionType)) #True 函数
# 对象调用func 就是一个方法
# print(isinstance(obj.func, FunctionType))
# 对于静态方法的研究
# print(isinstance(A.f, FunctionType))
# 结论
# 1. 类⽅法.不论任何情况,都是⽅法.
# 2. 静态方法,不论任何情况.都是函数
# 3. 实例方法,如果是实例访问.就是⽅法.如果是类名访问就是函数.
# 函数与方法
# 函数: 全都是显性传参
# 方法: 存在隐性传参
非学,无以致疑;非问,无以广识