zoukankan      html  css  js  c++  java
  • 实例和类变量以及类的魔术方法

    实例和类变量

    '''
    基本区别是:
    实例变量用于每个对象都是唯一的数据。
    类变量用于在类的不同实例之间共享的数据。
    '''

    class Cal(object):
        # pi 是类变量
        pi = 3.142
    
        def __init__(self, radius):
            # self.radius 是实例变量
            self.radius = radius
    
        def area(self):
            return self.pi * (self.radius ** 2)
    
    a = Cal(32)
    print(a.area()) # 3217.408
    print(a.pi) # 3.142
    a.pi = 43
    print(a.pi) # 43
    b = Cal(44)
    print(b.area()) # 6082.912
    print(b.pi) # 3.142
    '''
    使用不可变类变量时没有太多问题。因为一切正常,
    初学者不会尝试更多地了解这个主题,这是主要原因!
    如果你还认为使用不正确,实例和类变量不会导致任何问题
    '''
    class SuperClass(object):
        superpowers = []
    
        def __init__(self, name):
            self.name = name
    
        def add_superpower(self, power):
            self.superpowers.append(power)
    
    foo = SuperClass('foo')
    bar = SuperClass('bar')
    print(foo.name) # foo
    print(bar.name) # bar
    foo.add_superpower('fly')
    bar.add_superpower('bar')
    print(bar.superpowers) # 类变量会改变么 ['fly', 'bar']
    print(foo.superpowers) # ['fly', 'bar']
    '''
    这是可变类变量错误使用的美妙之处。
    为了使你的代码安全抵御这种意外攻击,请确保你不使用可变类变量。 
    只有当你知道自己在做什么时,才可以使用它们。
    '''
    

    新样式的类

    '''
    新旧样式类的区别
    1.旧的基类不会从任何东西继承。
    2.新样式基类继承自 object。
    '''

    class OldClass():
        def __init__(self):
            print('I am an old class')
            # return 'I am an old class' # __init__()初始化中return只能返回none
            return 
    
    class NewClass(object):
        def __init__(self):
            print('I am a jazzy new class')
            return 
    
    old = OldClass() # I am an old class
    print(old) # <__main__.OldClass object at 0x000001FDA40B5400>
    # Output: I am an old class
    
    new = NewClass() # I am a jazzy new class
    print(new) # <__main__.NewClass object at 0x000001FDA40B5438>
    

    '''
    从 object 继承允许新样式类利用一些 魔法。 一个主要优点是您可以使用一些有用的优化,
    slots。 您可以使用 super() 和描述符等。 底线?总是尝试使用新式的类。
    注意:Python 3 只有新式的类。无论您是否从 object 继承,都无关紧要。但是,建议您仍然从 object 继承。
    '''

    魔术方法

    Python 的类以其神奇的方法而闻名,通常称为 dunder(双下划线)方法。我将讨论其中的一些。

    '''
    init
    它是一个类初始化器。 每当创建一个类的实例时,都会调用其 init 方法。 例如:
    '''

    class GetTest(object):
        def __init__(self):
            print('Greetings!!')
        def another_method(self):
            print('I am another method which is not'
                  ' automatically called')
    
    a = GetTest() # Greetings!!
    '''
    在实例在创建后会立即调用 __init__。 你还可以在初始化期间将参数传递给类。
    '''
    class GetTest(object):
        def __init__(self, name):
            print('Greetings!! {0}'.format(name))
        def another_method(self):
            print('I am another method which is not'
                  ' automatically called')
    
    a = GetTest('yasoob')
    # 尝试创建一个不带参数的实例
    # b = GetTest() #__init__() missing 1 required positional argument: 'name'
    print('-'*10,"分割线","-"*10)
    
    #在类中实现 getitem 允许其实例使用 [](索引器)运算符
    class GetTest(object):
        def __init__(self):
            self.info = {
                'name':'Yasoob',
                'country':'Pakistan',
                'number':12345812
            }
    
        def __getitem__(self,i):
            print(self.info[i])
            return self.info[i]
    
    foo = GetTest()
    
    foo['name'] # Yasoob
    
    
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    数据结构 AVL树
    数据结构 快速排序
    Mybatis 传递多个参数
    数据结构 二叉搜索树
    Java 多线程 ReadWriteLock
    Java 基础 集合框架
    SourceTree安装跳过注册
    【前端部署】阿里云 windows2019服务器用node部署静态项目
    【node开发】node简易服务器一分钟搞定
    【node开发】node.js编写一个接口
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15272083.html
Copyright © 2011-2022 走看看