三十二、Python--面向对象(三)

目录

1.经典类和新式类区别

        1.1类型区别:

        1.2继承顺序不同

2.方法

3.Python中的下划线

4.魔术方法


1.经典类和新式类区别

        1.1类型区别:

        经典类 通过type查看到的实例类型都叫instance

        新式类 通过type查看到的实例类型是对象所对应的类名

        

#Python3中类的定义全是新式类,Python2中继承了object才是新式类,其余全是经典类

        1.2继承顺序不同

        经典类:深度优先 F-》D-》B-》A-》E-》C

        新式类:C3算法 F-》D-》B-》E-》C-》A

#C3算法子类优先于父类检查

class A():
    pass
    def test(self):
        print("from A")
class B(A):
    pass
    def test(self):
       print("from B")
class C(A):
    pass
    def test(self):
        print("from C")
class D(B):
    pass
    def test(self):
        print("from D")
class E(C):
    pass
    def test(self):
        print("from E")
class F(D,E):
    pass
    def test(self):
        print("from F")
f = F()
f.test()
# 经典类: F -> D -> B -> A -> E -> C
# 新式类: F -> D -> B -> E -> C -> A

2.方法

属性
    静态属性 --》类属性
    普通属性 --》实例属性
方法
    普通方法(实例)
    静态方法
    类方法
class Atm():
    name = "ATM"
    def __init__(self): # 普通方法
        self.country = "china"
    def normal_mathod(self, name):
        print("normal:")
        print(self.name,name)
    # 类方法
    @classmethod
    def class_method(cls, name):
        print("classmathod:")
        print(type(cls), cls)
        print(cls.name, name)
    # 静态方法
    @staticmethod
    def static_method(name):
        print("static_method:")
        print(Atm.name, name)

a1 = Atm()
#####实例调用类方法 、实例方法、 静态方法
# a1.normal_mathod("normalmethod")
# a1.class_method("classmethod") # 可以访问类属性,但不能访问实例属性
# a1.static_method("static") #可以访问类属性,不能访问实例属性

# __new__方法是静态方法
# __init__是实例方法


#可以通过类名调用类方法和静态方法
#通过类名调用实例方法,需要传入一个实例对象
Atm.normal_mathod(a1, "nomal_method") #需要传一个实例进去
Atm.class_method("classmethod")
Atm.static_method("static_method")

3.Python中的下划线

class Parent:
    """
    this is parent
    class
    """
    tmp = "tmp"
    _min = 1 # 保护属性
    __max = 10 # 私有属性

    def __init__(self):
        self.name = "sc"
        self._age = 5
        self.__desc = "it"

    def __make(self):
        print("这是一个私有方法")
        print(self.__desc)

    def _protectmake(self):
        print("这是一个保护方法")

    def show(self):
        print("这是一个普通实例方法")
        print(self.__desc, self.__max)

class Child(Parent):
    pass
    def show(self):
        print(self.__max)  #自动转换为_Child__max
        #子类对象也不能访问私有变量

"""
    Parent
        类属性 tmp _min __max
        实例属性 name _age __desc  --》_Parent__desc
        实例方法 __make _protectmake show
    
"""
p = Parent()
c1 = Child()
# print(p.tmp, c1.tmp)
# print(p._min, p._age)
# print(c1._min, c1._age)
# p._protectmake()
# c1._protectmake()
# 访问私有变量 __max __desc __make
# print(p.__max, p.__desc) #不能访问
# p.show()
# 私有对象不能通过实例访问,只可以被类访问,子类对象也不能访问
# c1.show()
# __desc__查看命名空间内有哪些属性
# print(p.__dict__)
# print(p._Parent__desc) #伪私有,可以通过访问
# print(p._Parent__max)

# python 私有变量是一个伪私有
# __max --》类名__max
# 可以通过_类名__属性名 这种方式访问到私有成员

# 查看对象的属性方法
# dir 查看对象的属性和方法,但是无法区分属性和方法
# print(dir(p))
# __dict__了解哪些是属性,哪些是方法
# print(p.__dict__)
# print(Parent.__dict__)
# help(Parent)
# 在类函数或模块里面的一个三引号引起来的字符串就是文档注释
# print(Parent.__doc__)

# 类名
# print(Parent.__name__)
# #类所在模块
# print(Parent.__module__) #--》相当于内建变量__name__
#
# #查看父类
# print(p.__class__)
#
# #查看父类
# print(Child.__bases__)
# #哈希查看属于哪一类
# print(c1.__hash__)

4.魔术方法

        构造函数(__new__/__init__)

        · __new__:创建实例

        · __init__:初始化实例

        析构函数(__del__)

from os.path import join
class FileObject:
    '''给文件对象进行包装从而确认在删除时文件流关闭'''
    def __init__(self, filepath='~', filename='sample.txt'):
        #读写模式打开一个文件
        self.file = open(join(filepath, filename), 'r+')
    def __del__(self):
        self.file.close()
        del self.file

        调用方法(__call__)

class apple():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __call__(self, x, y):
        self.x = x
        self.y = y

a = apple(1, 2)
print(a.x, a.y)
a(3, 4)
print(a.x, a.y)

        以字典的方式操作(# __getitem__ /__setitem__ /__delitme__)

  def __getitem__(self, key):
        print("get data:")
        return self.data.get(key, 0)

    def __setitem__(self, key, value):
        print("set data:")
        self.data[key] = value

    def __delitem__(self, key):
        print("delete data:")
        del(self.data[key])

a = A()
a["key"] = "value"
# 会自动调用__setitem__
a["k1"] = "v1"
print(a.data)

        其他魔术方法

__eq__(self, other) 定义了等号的行为, ==
__ne__(self, other) 定义了不等号的行为, !=
__lt__(self, other) 定义了小于号的行为,
<
__gt__(self, other) 定义了大于等于号的行为,
>=
__add__(self, other) +运算
__mul__(self, other) *运算
__len__(self, other) 获得长度
import time
class A():
    def __init__(self, num):
        self.num = num
        self.time = time.time()

    def __add__(self, x):
        print("this is add")
        return self.num + x
    def __gt__(self, other):
        print("this is gt")
        return self.time > other.time

a = A(5)
b = a + 6
print(b)
time.sleep(1)
c = A(3)
print(a > c)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值