类的实例

一、类实例化:类的实例化就是将类赋值给不同的对象.

1、实例化对象:

>>> class newClass():
    pass
# 像调用函数一样的表达式直接进行类的实例化:
>>> newObj = newClass()

2、使用__init__构造器初始化实例:

>>> class newClass():
    pass

>>> newObj = newClass()
>>> class newClass():
    def __init__(self,name):
        self.name = name
# 如果类的__init__函数中有参数且不是默认参数,那么进行实例化时必须将参数传进去,否则将会报错:
>>> newObj = newClass()
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    newObj = newClass()
TypeError: __init__() missing 1 required positional argument: ‘name‘
>>> newObj = newClass(‘new class‘)
>>> newObj.name
‘new class‘
>>> 

# 这里可以看到__init__函数的参数使用和普通的函数中的参数是一样的:
>>> class newClass():
    def __init__(self,name=‘new class‘):
        self.name = name
>>> newObj = newClass()
>>> newObj.name
‘new class‘
>>> 

3、__del__解构器,当实例被删除后会调用这个解构器,和类初始化时是逆过程。

>>> class InstTrack():
    count = 0
    def __init__(self):
        InstTrack.count += 1
    def __del__(self):
        InstTrack.count -= 1
    def howMany(self):
        return InstTrack.count

>>> a = InstTrack()
>>> b = InstTrack()
>>> id(a)
1786701000432
>>> id(b)
1786701000544
>>> a.howMany()
2
>>> b.howMany()
2
>>> del a
>>> b.howMany()
1
>>> del b
>>> InstTrack.count
0

二、实例属性

1、通过__init__()构造器设置静态属性;

2、通过__init__()构造器提供默认属性:和函数定义的默认参数是一样的;

3、__init__()不应该有return语句,不该返回对象,或者说应该返回None(即使一个函数中没有显示的写return语句,但是依然会默认返回None),由于在实例化时会默认调用__init__构造器,因此如果有return语句,那么实例就是这个返回的对象,而不是类返回的实例了,如:

# 如果返回非None值在实例化时会报错:
>>> class MyClass():
    def __init__(self):
        print("Initialized...")
        return 1

>>> mc = MyClass()
Initialized...
Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    mc = MyClass()
TypeError: __init__() should return None, not ‘int‘
# 返回Nnone时就不会报错了:
>>> class MyClass():
    def __init__(self):
        print("Initialized...")
        return None

>>> mc = MyClass()
Initialized...
>>> 

三、查看实例属性

1、dir()内建函数查看类属性:

>>> class Example():
    pass
>>> ex.user = ‘root‘>>> ex = Example()>>> ex.pri = 775
>>> dir(Example)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
>>>
>>> dir(ex)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘pri‘, ‘user‘]
>>> 

2、__dict__():实例属性组成的字典

>>> class Example():
    pass
>>> ex = Example()
>>> ex.user = ‘root‘
>>> ex.pri = 775
>>> ex.__dict__
{‘pri‘: 775, ‘user‘: ‘root‘}
>>> 

3、__class__():可以检查实例对象是哪个类初始化而来的

>>> ex.__class__
<class ‘__main__.Example‘>
>>> 

四、类属性和实例属性

1、类属性可通过实例获取和修改,实例属性只有实例可以获取和修改。

>>> class Example():
    version = 1.2    #定义了一个类的静态成员属性
>>> ex = Example()
# 在实例中没有创建属性时会通过类以及基类寻找属性,找到后可返回:
>>> ex.version
1.2
# 类可以调用自己的静态属性
>>> Example.version
1.2
# 类修改类属性:
>>> Example.version = 1.3
>>> Example.version
1.3
# 此时实例属性查看时也发生了变化:
>>> ex.version
1.3
>>>
# 但是此处给实例新增加了一个同名的属性,这个属性是这个实例的属性,与类的属性是分开的:
>>> ex.version = 1.0
>>> ex.version
1.0
# 可以看到类属性是没有变化的:
>>> Example.version
1.3
# 此时再实例化一个新实例,它的属性值也是默认的类属性:
>>> ex2 = Example()
>>> ex2.version
1.3
# 此时再次删除ex实例属性后,再次访问到的是类属性的值:
>>> del ex.version
>>> ex.version
1.3

五、调用和方法的绑定

1、调用绑定方法:即通过实例调用绑定在实例上的方法,在实际调用时不需要传入self的参数,self作为第一个参数被默认传入。

>>> class SaySomething():
    def __init__(self,sayWord = ‘hello,world!‘):
        self.sayWord = sayWord
    def say(self):
        print(self.sayWord)
>>> say1 = SaySomething()
# 通过实例调用绑定的方法:
>>> say1.say()
hello,world!
# 通过类调用绑定的方法时会报错:
>>> SaySomething.say()
Traceback (most recent call last):
  File "<pyshell#150>", line 1, in <module>
    SaySomething.say()
TypeError: say() missing 1 required positional argument: ‘self‘
>>> 

2、调用非绑定方法:最常用的是在子类中覆盖父类的方法,如在子类的__init__()构造器中覆盖父类构造器,但是在调用时必须显示的传入self参数,解释器才能知道需要初始化的是一个类而不是绑定在类上的实例:

>>> class SayOneWord(SaySomething):
    def __init__(self):
        SaySomething.__init__(self)

>>> say2 = SayOneWord()
>>> say2.say()
hello,world!
>>> 
时间: 2025-01-04 06:32:06

类的实例的相关文章

Python类中实例属性的通用显示工具

0.说明 以下的思想方法非常有用,可以帮助你在Python开发提高开发和维护效率,所以可能的话,请仔细琢磨一下其中的代码. 之前在用Python编写一个类时,为了显示的友好性,总是需要在每个类中重载__str__或者__repr__方法,现在有了更好的方法,不需要在每个类中都这么做了,下面给出的方法非常实用. 下面使用的例子使用的Python版本都是Python3.5,但实际上在Python2.7中进行也没有任何影响. 1.正常情况下类实例的不友好显示 在Python中编写一个类时,由于没有重载

C# 利用反射根据类名创建类的实例对象

“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");

Python - 04182016 - 类与实例间属性的理解

Python是个很灵活的语言,光看它的类和实例间属性的访问机制就可以看出这一点,不过这一点还真的不好理解,做了些测试之后我的理解是这样的: 实例在访问类属性时,先检索自己的names, 如果有的话就直接取出,没有的话就去来的names里面找,找不到就是error啦 class Pclass(object): """docstring for Pclass""" num = 10 def __init__(self): super(Pclass,

静态方法中访问类的实例成员

public class StaticShiLi { static int i=1; int j=2; static void m(){ System.out.println(j);报错 } public static void main(String[] args) { // TODO Auto-generated method stub } } 程序报错,显示无法访问. 疑问:那么怎样在静态方法中访问类的实例成员呢?

ja获取Unsafe类的实例和取消eclipse编译的错误和警告

JRE的rt.jar中提供了一个类sun.misc.Unsafe,虽然这个类因为其不其安全性,不建议使用,而且被加了诸多限制:但 是在很多场合下我们确实需要这个类提供的强大功能.JDK类库下的NIO和concurrent包下的很多类都使用到了Unsafe 类,如AtomicInteger和AbstractQueuedSynchronizer等. JDK源码中对这个类进行了严格限制,我们不能通过常规new的方式去获取该类的实例,也不能通过Unsafe.getUnsafe ()来获取实例.但是我们可

使用MethodType函数将方法绑定到类或实例上

在开始正文之前,需要了解下Python的绑定方法(bound method)和非绑定方法. 简单做个测试: 定义一个类,类中由实例方法.静态方法和类方法. class ClassA: def instance_method(self): print('instance_method', self) @classmethod def cls_method(cls): print('cls_method', cls) @staticmethod def static_method(): print(

Java判断类和实例的关系

?? 通常我们使用instanceOf关键字来判断一个对象是否是类的实例,最近博主看到isInstance关键字,不解与instanceOf的区别,故度娘了一下,顺便涨了一下姿势. ?? Java中判断类和实例的关系有3个关键字:instanceof, isInstance以及isAssignableFrom. instanceof:用来判断对象是否是类的实例 isInstance:用来判断对象是否属于某个类型的实例 isAssignableFrom:用来判断类型间是否存在派生关系 ??看完上面

只能通过类而不能通过类的实例访问常量属性

1.静态属性.静态方法 在面向对象编程中,我们不仅可以通过对象访问方法和属性,还可以通过类来访问它们.这样的方法和属性就是“静态的”(static),必须用static关键字来声明. [php] view plaincopyprint? class staticExample { staticpublic $num = 0; staticpublic function sayNum() { echoself::num; } } 静态方法是以类作为作用域的函数.静态方法不能访问这个类中的普通属性,

C# Activator.CreateInstance 动态创建类的实例(二)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Kernel.Interface { public interface IObjcet { void Put(); void Put(string plus); } } using System; using System.Collections.

Java类、实例的初始化顺序

题目: public class InitTest{ public static int k = 0; public static InitTest t1 = new InitTest("t1"); public static InitTest t2 = new InitTest("t2"); public static int i = print("i"); public static int n = 99; public int j = pr