美文网首页Python全栈工程师
27.2-类定义和初始化

27.2-类定义和初始化

作者: BeautifulSoulpy | 来源:发表于2019-11-30 10:35 被阅读0次

    “人生最尊贵的事是什么?”
    人生最尊贵的事情就是面对别人的虚伪与不义,仍能保持自己对别人的亲切!

    要学会容忍人家,人家没有修,人家是凡人,你是有修的人,你是一个圣人,你是假我,别把你当成真的。人的修养是靠什么让人家来尊敬的?就是语言,行为。为什么叫修心修行,就是一个语言,一个行为,心里的行为。

    总结:

    1. 每一次实例化都会产生完全不同的对象,内存地址相同只能当巧合,不能当真
    2. _init_ 方法中,默认必须是 return None

    1.Python的类

    class ClassName:

    1. 必须使用class关键字
    2. 类名必须是用大驼峰命名
    3. 类定义完成后,就产生了一个类对象,绑定到了标识符ClassName上
    def add(x,y):
        return x+y
    
    class Person:   # 类对象(非类的对象,注意区分)
        pass
    
    
    class MyClass:
      """A example class"""    # #__doc__
      x = 'abc' # 类属性
      def foo(self): # 类属性foo,也是方法(看做函数)
    # 本质上 x  foo  都是类属性
        return 'My Class'
    print(MyClass.x)
    print(MyClass.foo)
    print(MyClass.__doc__)
    #-------------------------------------------------
    abc
    <function MyClass.foo at 0x000002406FCCD048>
    A example class
    
    总结:
    1. 方法是可以加 括号 调用的,
    

    2.类对象及类属性和方法

    类对象,类的定义就会生成一个类对象
    类的属性,类定义中的变量和类中定义的方法都是类的属性
    类变量,上例中x是类MyClass的变量
    类的私有属性:双下划綫开头,或但下滑线开头;
    MyClass中,x、foo都是类的属性, doc 也是类的属性

    foo方法是类的属性,如同 吃 是人类的方法,但是每一个具体的人才能吃东西,也就是说 吃 是人的实例才能调用的方法。
    foo是方法对象method,不是普通的函数对象functions了,它一般要求至少有一个参数,第一个参数是self(self只是个惯用标识符,可以换名字),这个参数位置就留给了self。

    self 指代当前实例本身

    类属性与方法:

    类的私有属性
    private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.private_attrs。

    类的方法
    在类地内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
    self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。

    类的私有方法
    private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用。self.private_methods。

    3.构造函数(初始化)

    • 很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 init() 的特殊方法(构造方法),像下面这样:


    • 类定义了 init() 方法的话,类的实例化操作会自动调用 init() 方法。所以在下例中,可以这样创建一个新的实例:


    • 当然, init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。例如:


    类的实例化与初始化

    self代表类的实例,而非类

    实例化 Class()

    每一次实例化只能生成该类的具体实例,
    每一次实例化都会产生完全不同的对象,内存地址相同只能当巧合,不能当真

    a = MyClass() # 实例化,相当于对类进行调用;
    

    使用上面的语法,在类对象名称后面加上一个括号,就调用类的实例化方法,完成实例化。
    实例化就真正创建一个该类的对象(实例)。例如

    tom = Person()
    jerry = Person()
    

    上面的tom、jerry都是Person类的实例,通过实例化生成了2个实例。

    每次实例化后获得的实例,是不同的实例,即使是使用同样的参数实例化,也得到不一样的对象。

    Python类实例化后,会自动调用 init 方法。这个方法第一个参数必须留给self,其它参数随意。(特殊方法)

    初始化 _init_方法

    MyClass()实际上调用的是 init(self) 方法,可以不定义,如果没有定义会在实例化后隐式调用
    作用:对实例进行初始化

    class MyClass:
        def __init__(self):
            print('init')
    print(MyClass) # 不会调用
    print(MyClass()) # 调用__init__
    a = MyClass() # 调用__init__
    print(a)
    #-------------------------------------------------
    <class '__main__.MyClass'>
    init
    <__main__.MyClass object at 0x000002406FCB8E10>
    init
    
    # 每一次的调用都不同;
    
    class Person:
        def __init__(self):
            print('init',id(self))
    print(Person) #不会调用  
    print('-'*30)
    tom = Person()  #实例化
    print(tom,hex(id(tom)))
    jerry = Person()   # 调用init
    print(jerry,hex(id(jerry)))
    #----------------------------------------------------------------------------------------------------
    <class '__main__.Person'>
    ------------------------------
    init 2475813918872
    <__main__.Person object at 0x0000024072025898> 0x24072025898
    init 2475813859224
    <__main__.Person object at 0x0000024072016F98> 0x24072016f98
    
    #初始化 相当于 传参数;
    
    
    class Person:
        def __init__(self, name, age):
            print('init',hex(id(self)))
            self.name = name
            self.age = age
    print(Person)
    tom = Person('Tom', 20) # 实例化,会调用__init__方法并为实例进行属性的初始化
    jerry = Person('Je', 25)
    print(tom,jerry)
    print(tom.name,jerry.name)
    print(tom.age,jerry.age)
    #--------------------------------------------------
    <class '__main__.Person'>
    init 0x2407202a710
    init 0x2407202a9b0
    <__main__.Person object at 0x000002407202A710> <__main__.Person object at 0x000002407202A9B0>
    Tom Je
    20 25
    
    

    相关文章

      网友评论

        本文标题:27.2-类定义和初始化

        本文链接:https://www.haomeiwen.com/subject/efnnwctx.html