类中有意思的一些

1. 例一   类是一种类型,内建类型(int,float)也是一种类

class Myclass():
   pass

print(type(Myclass))
print(type(Myclass()))
print(type(0))
print(type(int))

结果

<class ‘type‘>
<class ‘__main__.Myclass‘>
<class ‘int‘>
<class ‘type‘>

所以,3.0中统一了,类是类型,int是一种类型,类型也是一种类型。

例二:一切皆对象

def fn(self,name=‘world‘):
    print(‘Hello,%s.‘% name)
Hello = type(‘Hello‘,(object,),dict(hello=fn))   #函数能够被赋值
h=Hello()
h.hello()   #Hello,world.

以上,函数是对象

class ObjectCreator():
    pass
print(ObjectCreator)
def echo(o):
    print(o)
echo(ObjectCreator)    #可以将它作为参数传给函数
ObjectCreator.newattr = ‘foo‘
print(hasattr(ObjectCreator,‘newattr‘))
ObjectCreator2=ObjectCreator #你可将它赋给一个变量
print(ObjectCreator2())

运行结果:

<class ‘__main__.ObjectCreator‘>
<class ‘__main__.ObjectCreator‘>
True
<__main__.ObjectCreator object at 0x0027B430>

以上,类也是对象

例三:关于“self”

首先,方法是类属性,不是实例属性。类中的方法有self,self表示用于在类实例方法中引用方法所绑定的实例。因为方法的实例在任何方法调用中总是第一个参数传递的,self被选中来代表实例。

class C():
    def test(self):
        print(‘got it‘)

c=C()print(C.test)   #类属性,表示一种函数
print(c.test)   #C.test的绑定方法,方法只有实例才能被调用
c.test()
C.test(c)   #这样行!!!

显示结果

<function C.test at 0x006F36F0>
<bound method C.test of <__main__.C object at 0x001FB490>>
got it
got it

下面的代码也可以行

class C():
    def test(self):
        print(‘got it‘)
class P(C):
    def test(self):
        print(‘got it 2‘)
        pass

p=P()
C.test(p)     #got it
p.test()    #got it 2

例四:__new__和__init__区别

在实例创建过程中__new__方法先于__init__方法被调用,因为所有的__new__方法是类方法,所以传入类的第一个参数是类,一般用cls表示。

如果不需要其它特殊的处理,可以使用object的__new__方法来得到创建的实例(也即self)。

于是我们可以发现,实际上可以使用其它类的__new__方法类得到这个实例,只要那个类或其父类或祖先有__new__方法。

class another(object):
  def __new__(cls,*args,**kwargs):
    print("newano")
    return object.__new__(cls, *args, **kwargs)
class display(object):
  def __init__(self, *args, **kwargs):
    print("init")
  def __new__(cls, *args, **kwargs):
    print("newdis")
    print(type(cls))
    return another.__new__(cls, *args, **kwargs)

a=display()

 运行结果

newdis
<class ‘type‘>
newano
init

例子五:对标准类型子类化

1 a=dict(((‘wangzixuan‘,12),(‘wangzifeng‘,13),(‘lingmiaoqiang‘,14)))
2 print(sorted(a.keys()))
3
4 class SortedKeyDict(dict):
5     def keys(self):
6         return sorted(super(SortedKeyDict,self).keys())   #这句话必须用super(SortedKeyDict,self),如果用self会 报错
7 a=SortedKeyDict(((‘wangzixuan‘,12),(‘wangzifeng‘,13),(‘lingmiaoqiang‘,14))) print(a.keys())
运行结果
[‘lingmiaoqiang‘, ‘wangzifeng‘, ‘wangzixuan‘]
[‘lingmiaoqiang‘, ‘wangzifeng‘, ‘wangzixuan‘]

解释:当创建实例的时候,因为我们调用的类是dict的基类,除了self()其他内置函数没有改变,所以第七行等同于第一行。

因为dict类(是的,dict是一种类)中,实例a采用a.keys()有提取字典的keys的作用,所以我们可以重新定义keys()函数,使得可以提取字典的keys并进行排序,所以要调用dict类中的方法,参见第6行。

例子六

时间: 2024-08-12 12:03:20

类中有意思的一些的相关文章

java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),表示存入银行100元,当用方法withdrawal(150),withdrawal(-15)时会抛出自定义异常. pa

编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类。Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分;School 中计算平均分的方法是所有科目的分数之和除以总科目数。 要求:定义ComputerAv

题目: 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数. 定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类. Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分: School 中计算平均分的方法是所有科目的分数之和除以总科目数. 要求:定义ComputerAverage的对象为上转型对象,并调用重写的方法averge. 题目用到:1.方法的多态

(一)、写一个怪物的类,类中有属性姓名(name),攻击力(attack),有打人的方法(fight)。(方法的重写)

(一).写一个怪物的类,类中有属性姓名(name),攻击力(attack),有打人的方法(fight).再写两个子类:红猪的类:类中有属性姓名(name),攻击力(attack),颜色(color).红猪也有一个打人的方法(fight),要求在此方法中输出"XX猪是XX颜色的,打掉了人XX点血".蛇类:类中有属性姓名(name),有攻击力属性(attack),有几条脚属性(foot).蛇也有一个打人的方法(fight),要求在此方法中输出"XX蛇用XX条脚跑到人面前去打人,打

Object类中有几个方法

软件152笪世海 protected Object   clone()创建并返回此对象的一个副本.   boolean   equals(Object obj)指示其他某个对象是否与此对象"相等".   protected void   finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法.   Class<?>   getClass()返回此 Object 的运行时类.   int   hashCode()返回该对象的哈希码值.  

77.初始化数据,如果类中有其他类,需要重写构造函数

1 #include <iostream> 2 #include <cstdlib> 3 #include <string> 4 using namespace std; 5 6 //初始化数据的时候,如果类中引用其他类,需要重写构造函数,int也是类 7 class myclass 8 { 9 public: 10 int x; 11 int y; 12 13 public: 14 myclass(int a,int b) : x(a),y(b) 15 { 16 17

Python3基础 一个类中有两个属性A,B。 只能对其中的一个进行赋值

镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.------------------------------------------ code: #很多有趣的功能,看似简单,但是你要是写起来,可不那么容易呐. #多思考,心常清静,好好看小甲鱼的视频教程 class MyClass : def __init__(self) : self.boolBook = True self.boolPen = True #酱油选手 s

2.建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,

public class Bank { Double qian=0.0; double newBank(double a) { qian=qian+a; return qian; } double withDrawal(double dAmount) throws Exception { if(dAmount>qian) { throw new Exception("InsufficientFundsException"); } if(dAmount<0) { throw

关于上次我写的那个ATM程序 ,程序没有什么错,但是有些麻烦,两个类中有好多成员函数重复,因此我把ATM重新写了一边。

不好意思!但是现在这个程序比上次那个好多了,而且没有重复,程序看起来比较简练,以下是新程序: #include<iostream>#include<string>using namespace std; class consumer{public: void int_consumer(string N ,string I,string P,float M);   //初始化 string get_name();   //读取姓名 string get_id();   //读取账号 

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个