细分类的组成成员

细分类的组成成员

成员有以下:
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
class A:
    num = 1
    def func(self):
        print('实例方法')
    @classmethod  # 类方法: 由类名直接调用的方法,他会自动的将类名传给cls
    def a_func(cls,name):
        print(f'cls---> {cls}')
        print(cls,name)
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. 实例方法,如果是实例访问.就是⽅法.如果是类名访问就是函数.
# 函数与方法
# 函数: 全都是显性传参
# 方法: 存在隐性传参

猜你喜欢

转载自www.cnblogs.com/saoqiang/p/12386603.html