Python全栈工程师

27.2-类定义和初始化

2019-11-30  本文已影响0人  BeautifulSoulpy

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

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

总结:

  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

上一篇下一篇

猜你喜欢

热点阅读