首页 文章 精选 留言 我的

精选列表

搜索[Rust编程],共10000篇文章
优秀的个人博客,低调大师

go并发编程之美(一)

一、前言 在Java中多线程之间是通过共享内存进行通信的,在go中多线程之间通信是基于消息的,go中的通道是go中多线程通信的基石。 在java中创建的线程是与OS线程一一对应的,而在go中多个协程(goroutine)对应一个逻辑处理器,每个逻辑处理器与OS线程一一对应。 每个线程要运行必须要在就绪状态情况下获取cpu,而操作系统是基于时间片轮转算法来调度线程占用cpu来执行任务的,每个OS线程被分配一个时间片来占用cpu进行任务的执行。 在java中由于创建的线程与os线程一一对应,所以java中的每个线程占用一个时间片来运行。而go中多个协程对应一个os 线程,也就是多个协程对应了一个时间片,go则使用自己的调度策略(非os的调度策略)来让多个协程使用一个时间片来并发的运行。也就是go中存在两级策略,一个是go语言层面的调度多个协程

优秀的个人博客,低调大师

Unity C#编程优化——枚举

考虑下面关于行星枚举的这个例子:public enum Planet { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO // Pluto is a planet!!!}起初,这样的定义还算好,直到需要产生一个行星的质量。所以我们做这样的事情:// Returns the mass of the planet in 10^24 kgpublic float GetMass(Planet planet) { switch(planet) { case Planet.MERCURY: return 0.330; case Planet.VENUS: return 4.87f; case Planet.EARTH: return 5.97f; ... case Planet.PLUTO: return 0.0146f; }} 行星直径又如何? 另一个switch语句? 密度怎么样? 重力? 逃跑速度? 只要想想你将要维护的switch语句的数量。 你可以争辩说,你可以使用一个Dictionary,但仍然笨重。 每个数据的Dictionary都要映射?没门。有一个更好的方法,我会告诉你如何。 这可能已经是非Unity程序员的常识,但我想在我的博客中再次提出这个冗余的主题,对于那些可能不知道这一点的人来说,特别是初学者。 我也想保持简单。基本上,你可以使用类作为枚举。 为什么用类? 这确实表现的更好 您可以存储任意数量的任意数据。 您甚至可以存储例程或功能。 你可以做很多事情。 唯一的要求是它是不可变的,这意味着类一个实例的状态在整个程序期间都不能改变。以下是Planet枚举用类表示的一个版本:public class Planet { // The different values public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f); public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f); public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f); public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f); public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f); public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f); public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f); public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f); public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f); // Use readonly to maintain immutability private readonly int id; private readonly float mass; // in 10^24 kg private readonly int diameter; // in km private readonly int density; // in kg/m^3 private readonly float gravity; // in m/s^2 // We use a private constructor because this should not be instantiated // anywhere else. private Planet(int id, float mass, int diameter, int density, float gravity) { this.id = id; this.mass = mass; this.diameter = diameter; this.density = density; this.gravity = gravity; } public int Id { get { return id; } } public float Mass { get { return mass; } } public int Diameter { get { return diameter; } } public int Density { get { return density; } } public float Gravity { get { return gravity; } } }为了保持不变性,所有成员变量应该是只读的。 一旦他们被分配,他们将不能再被改变。 这很重要,因为作为枚举,它的内部值不应该改变。 然后将每个枚举值实现为该类的静态只读实例。这是怎么用的? 与正常枚举是一样的,如下使用:// Use it like an enumship.TargetPlanet = Planet.NEPTUNE;// Want to know the target planet's mass?float mass = ship.TargetPlanet.Mass;// Density?int density = ship.TargetPlanet.Density;我们已经消除了切换语句或字典来维护不同行星信息的需要。 想要一个新的行星状态? 只需添加一个新的成员变量并在实例化上指定它们。如何从其他数据类型转换? 喜欢说从int id转换为Planet实例? 这很容易 通常我为这些转换添加了一个公共和静态方法。 例如:public class Planet { // The different values public static readonly Planet MERCURY = new Planet(0, 0.330f, 4879, 5427, 3.7f); public static readonly Planet VENUS = new Planet(1, 4.87f, 12104, 5243, 8.9f); public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f); public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f); public static readonly Planet JUPITER = new Planet(4, 1898.0f, 142984, 1326, 23.1f); public static readonly Planet SATURN = new Planet(5, 568.0f, 120536, 687, 9.0f); public static readonly Planet URANUS = new Planet(6, 86.8f, 51118, 1271, 8.7f); public static readonly Planet NEPTUNE = new Planet(7, 102.0f, 49528, 1638, 11.0f); public static readonly Planet PLUTO = new Planet(8, 0.0146f, 2370, 2095, 0.7f); // This can be used to loop through all planets public static Planet[] ALL = new Planet[] { MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE, PLUTO }; // Converts the specified id to a Planet instance public static Planet Convert(int id) { for(int i = 0; i < ALL.Length; ++i) { if(ALL.Id == id) { return ALL; } } // return ALL[id] could also work here but what if a non sequential id is used? throw new Exception("Cannot convert {0} to a Planet.".FormatWith(id)); } ...}// UsagePlanet planet = Planet.Convert(someIntPlanet);想从字符串ID转换? 添加将保存此值的字符串成员变量。 而不是使用诸如ALL []的数组,您可以使用如下所示的Dictionary:private static Dictionary<string, planet="" style="color: rgb(34, 34, 34); font-family: 微软雅黑; font-size: 15px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-style: initial; text-decoration-color: initial;">ALL = new Dictionary<string, planet="">() { { MERCURY.TextId, MERCURY }, { VENUS.TextId, VENUS }, { EARTH.TextId, EARTH }, ... { PLUTO.TextId, PLUTO },};// Converts the specified string to a Planet instancepublic static Planet Convert(string id) { return ALL[id];}您可以支持您喜欢的任何类型的转换。还有更多的你可以做。 您现在可以添加功能。 你可以这样做:Planet currentPlanet = Planet.VENUS;currentPlanet.ApplyGravity(ship);The coolest thing for me is you can specify different actions or behavior to the enum values. Something like this (It’s very contrived but you get the idea.):public static readonly Planet EARTH = new Planet(2, 5.97f, 12756, 5514, 9.8f, delegate(Ship ship) { // Actions on land of ship ship.AddFood(1000); ship.RetireCrew(); ship.RecruitNewCrew();});public static readonly Planet MARS = new Planet(3, 0.642f, 6792, 3933, 3.7f, delegate(Ship ship) { // Actions on land of ship ship.DeductFood(50); ship.Research(); ship.Mine();});通过简单地将你的枚举变成一个类,你已经将它升级到更有组织的东西,而且更加功能强大。 您也可以使用反射和继承等先进功能,但大多数情况下,您不需要。 更多unity2018的功能介绍请到paws3d学习中心查找。

优秀的个人博客,低调大师

python之面向对象编程二

类的成员 类的成员可以分为三大类:字段、方法、属性。 字段:普通字段、静态字段。 方法:普通方法、类方法、静态方法 属性:普通属性。 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。 一、字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同。 普通字段属于对象 静态字段属于类 class Province: # 静态字段 country = '中国' def __init__(self, name): # 普通字段 self.name = name # 直接访问普通字段 obj = Province('吉林省') print obj.name # 直接访问静态字段 Province.country 字段的定义和使用 由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图: 由上图可是: 静态字段在内存中只保存一份 普通字段在每个对象中都要保存一份 应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段 二、方法 方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self; 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls; 静态方法:由类调用;无默认参数; 1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法。 class people(object): def __init__(self,name): self.name = name @staticmethod #把eat方法变为静态方法 def eat(self): print("%s is eating" % self.name) d = people("tom") d.eat() 上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。 Traceback (most recent call last): File "D:/pycharm/project/day6/静态方法.py", line 13, in <module> d.eat() TypeError: eat() missing 1 required positional argument: 'self' 想让上面的代码可以正常工作有两种办法 1. 调用时主动传递实例本身给eat方法,即d.eat(d) 2. 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了 class people(object): def __init__(self, name): self.name = name @staticmethod # 把eat方法变为静态方法 def eat(): print("is eating" ) p = people("tom") p.eat() 2.类方法 类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量 class people(object): def __init__(self, name): self.name = name @classmethod # 类方法 def eat(self): print("%s is eating"%self.name ) p = people("tom") p.eat() 执行报错如下,说people没有name属性,因为name是个实例变量,类方法是不能访问实例变量的 Traceback (most recent call last): File "D:/pycharm/project/day6/静态方法.py", line 12, in <module> p.eat() File "D:/pycharm/project/day6/静态方法.py", line 9, in eat print("%s is eating"%self.name ) AttributeError: type object 'people' has no attribute 'name' 此时可以定义一个类变量,也叫name,看下执行效果 class people(object): name = '我是类变量' def __init__(self, name): self.name = name @classmethod # 类方法 def eat(self): print("%s is eating"%self.name ) p = people("tom") p.eat() #执行结果 我是类变量 is eating 三、属性 通过上述Python类中的方法,Python中的属性是普通方法的变行。 对于属性,有以下三个知识点: 属性的基本使用 属性的两种定义方式 1.属性的基本使用 # ############### 定义 ############### class people: def func(self): print('普通属性...') # 定义属性 @property def prop(self): print('property属性调用..') # ############### 调用 ############### p = people() p.func() p.prop #调用属性 属性的定义及使用 由属性的定义和调用要注意一下几点: 定义时,在普通方法的基础上添加@property装饰器; 定义时,属性仅有一个self参数 调用时,无需括号 方法:p.func() 属性:p.prop 注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象 属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能 2、属性的两种定义方式 属性的定义有两种方式: 装饰器 即:在方法上应用装饰器 静态字段 即:在类中定义值为property对象的静态字段 装饰器方式:在类的普通方法上应用@property装饰器 经典类,具有一种@property装饰器 # ############### 定义 ############### class people: # 定义属性 @property def prop(self): return 'tom' # ############### 调用 ############### p = people() result = p.prop # 自动执行 @property 修饰的 price 方法,并获取方法的返回值 print(result) View Code 新式类,具有三种@property装饰器 class product(object): @property def price(self): print( '@property') @price.setter def price(self, value): print( '@price.setter') @price.deleter def price(self): print ('@price.deleter') # ############### 调用 ############### obj = product() obj.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值 obj.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数 del obj.price # 自动执行 @price.deleter 修饰的 price 方法 View Code 注:经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法 由于新式类中具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除 class product(object): def __init__(self): # 原价 self.original_price = 100 # 折扣 self.discount = 0.8 @property def price(self): # 实际价格 = 原价 * 折扣 new_price = self.original_price * self.discount return new_price @price.setter def price(self, value): self.original_price = value @price.deleter def price(self, value): del self.original_price obj = product() print(obj.price) # 获取商品价格 obj.price = 200 # 修改商品原价 print(obj.original_price) # del obj.price # 删除商品原价 实例 静态字段方式:创建值为property对象的静态字段 当使用静态字段的方式创建属性时,经典类和新式类没有什么区别 class people: def talk(self): return 'yu' TALK = property(talk) obj = people() reuslt = obj.TALK # 自动调用talk方法,并获取方法的返回值 print( reuslt) View Code property的构造方法中有个四个参数 第一个参数是方法名,调用对象.属性时自动触发执行方法 第二个参数是方法名,调用对象.属性 = XXX时自动触发执行方法 第三个参数是方法名,调用del 对象.属性时自动触发执行方法 第四个参数是字符串,调用对象.属性.__doc__,此参数是该属性的描述信息 class people: def get_bar(self): return 'yu' # *必须两个参数 def set_bar(self, value): return 'set value' + value def del_bar(self): return 'yu' BAR=property(get_bar, set_bar, del_bar, 'description...') obj = people() print(obj.BAR) # 自动调用第一个参数中定义的方法:get_bar obj.BAR = "hehe" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入 del people.BAR # 自动调用第三个参数中定义的方法:del_bar方法 obj.BAR.__doc__ # 自动获取第四个参数中设置的值:description... View Code 由于静态字段方式创建属性具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除 class product(object): def __init__(self): # 原价 self.original_price = 100 # 折扣 self.discount = 0.8 def get_price(self): # 实际价格 = 原价 * 折扣 new_price = self.original_price * self.discount return new_price def set_price(self, value): self.original_price = value def del_price(self, value): del self.original_price PRICE = property(get_price, set_price, del_price, '价格属性描述...') obj = product() obj.PRICE # 获取商品价格 obj.PRICE = 200 # 修改商品原价 del obj.PRICE # 删除商品原价 View Code 所以,定义属性共有两种方式,分别是【装饰器】和【静态字段】,而【装饰器】方式针对经典类和新式类又有所不同。 类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 公有成员,在任何地方都能访问 私有成员,只有在类的内部才能方法 私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线。(特殊成员除外,例如:__init__、__call__、__dict__等) class C: def __init__(self): self.name = '公有字段' self.__foo = "私有字段" 私有成员和公有成员的访问限制不同: 静态字段 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问 私有静态字段:仅类内部可以访问; class C: name = "公有静态字段" def func(self): print C.name class D(C): def show(self): print C.name C.name # 类访问 obj = C() obj.func() # 类内部可以访问 obj_son = D() obj_son.show() # 派生类中可以访问 公有静态字段 class C: __name = "公有静态字段" def func(self): print C.__name class D(C): def show(self): print C.__name C.__name # 类访问 ==> 错误 obj = C() obj.func() # 类内部可以访问 ==> 正确 obj_son = D() obj_son.show() # 派生类中可以访问 ==> 错误 私有静态字段 普通字段 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问 私有普通字段:仅类内部可以访问; ps:如果想要强制访问私有字段,可以通过 【对象._类名__私有字段明 】访问(如:obj._C__foo),不建议强制访问私有成员。 class C: def __init__(self): self.foo = "公有字段" def func(self): print( self.foo) # 类内部访问 class D(C): def show(self): print( self.foo) #派生类中访问 obj = C() obj.foo # 通过对象访问 obj.func() # 类内部访问 obj_son = D() obj_son.show() # 派生类中访问 公有字段 class C: def __init__(self): self.__foo = "私有字段" def func(self): print(self.foo ) # 类内部访问 class D(C): def show(self): print(self.foo) #派生类中访问 obj = C() #obj.__foo # 通过对象访问 ==> 错误 obj.func() # 类内部访问 ==> 正确 obj_son = D() #obj_son.show() # 派生类中访问 ==> 错误 私有字段 方法、属性的访问于上述方式相似,即:私有成员只能在类内部使用 ps:非要访问私有属性的话,可以通过 对象._类__属性名 类的特殊成员 上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用。无论人或事物往往都有不按套路出牌的情况,Python的类成员也是如此,存在着一些具有特殊含义的成员,详情如下: 1. __doc__ 表示类的描述信息 class Foo: """ 描述类信息 """ def func(self): pass print Foo.__doc__ #输出:描述类信息 View Code 2.__module__ 和 __class__ __module__ 表示当前操作的对象在那个模块 __class__ 表示当前操作的对象的类是什么 #!/usr/bin/env python # -*- coding:utf-8 -*- class C: def __init__(self): self.name = 'yu' lib/aa.py from lib.aa import C obj = C() print obj.__module__ # 输出 lib.aa,即:输出模块 print obj.__class__ # 输出 lib.aa.C,即:输出类 index.py 3.__init__ 构造方法,通过类创建对象时,自动触发执行。 class Foo: def __init__(self, name): self.name = name self.age = 18 obj = Foo('wupeiqi') # 自动执行类中的 __init__ 方法 View Code 4.__del__ 析构方法,当对象在内存中被释放时,自动触发执行。 注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。 class Foo: def __del__(self): pass View Code 5.__call__ 对象后面加括号,触发执行。 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()() class Foo: def __init__(self): pass def __call__(self, *args, **kwargs): print( '__call__') obj = Foo() # 执行 __init__ obj() # 执行 __call__ View Code 6.__dict__ 类或对象中的所有成员 上文中我们知道:类的普通字段属于对象;类中的静态字段和方法等属于类,即: class Province: country = 'China' def __init__(self, name, count): self.name = name self.count = count def func(self, *args, **kwargs): print( 'func') # 获取类的成员,即:静态字段、方法、 print(Province.__dict__) # 输出:{'__doc__': None, '__init__': <function Province.__init__ at 0x0000025AFBF7E1E0>, 'country': 'China', '__dict__': <attribute '__dict__' of 'Province' objects>, '__weakref__': <attribute '__weakref__' of 'Province' objects>, '__module__': '__main__', 'func': <function Province.func at 0x0000025AFBF7E268>} obj1 = Province('HeBei',10000) print(obj1.__dict__) # 获取 对象obj1 的成员 # 输出:{'count': 10000, 'name': 'HeBei'} obj2 = Province('HeNan', 3888) print(obj2.__dict__) # 获取 对象obj1 的成员 # 输出:{'count': 3888, 'name': 'HeNan'} View Code 7.__str__ 如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。 class Foo: def __str__(self): return 'yu' obj = Foo() print(obj) # 输出:yu View Code 8、__getitem__、__setitem__、__delitem__ 用于索引操作,如字典。以上分别表示获取、设置、删除数据 #!/usr/bin/env python # -*- coding:utf-8 -*- class Func(object): def __getitem__(self, key): print '__getitem__',key def __setitem__(self, key, value): print '__setitem__',key,value def __delitem__(self, key): print '__delitem__',key obj = Func() result = obj['k1'] # 自动触发执行 __getitem__ obj['k2'] = 'wupeiqi' # 自动触发执行 __setitem__ del obj['k1'] # 自动触发执行 __delitem__ View Code 9、__getslice__、__setslice__、__delslice__ 该三个方法用于分片操作,如:列表 #!/usr/bin/env python # -*- coding:utf-8 -*- class Foo(object): def __getslice__(self, i, j): print '__getslice__',i,j def __setslice__(self, i, j, sequence): print '__setslice__',i,j def __delslice__(self, i, j): print '__delslice__',i,j obj = Foo() obj[-1:1] # 自动触发执行 __getslice__ obj[0:1] = [11,22,33,44] # 自动触发执行 __setslice__ del obj[0:2] # 自动触发执行 __delslice__ View Code 10. __iter__ 用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ class Foo(object): pass obj = Foo() for i in obj: print i # 报错:TypeError: 'Foo' object is not iterable 第一步 #!/usr/bin/env python # -*- coding:utf-8 -*- class Foo(object): def __iter__(self): pass obj = Foo() for i in obj: print i # 报错:TypeError: iter() returned non-iterator of type 'NoneType' 第二步 #!/usr/bin/env python # -*- coding:utf-8 -*- class Foo(object): def __init__(self, sq): self.sq = sq def __iter__(self): return iter(self.sq) obj = Foo([11,22,33,44]) for i in obj: print i 第三步 以上步骤可以看出,for循环迭代的其实是 iter([11,22,33,44]) ,所以执行流程可以变更为: #!/usr/bin/env python # -*- coding:utf-8 -*- obj = iter([11,22,33,44]) for i in obj: print i #!/usr/bin/env python # -*- coding:utf-8 -*- obj = iter([11,22,33,44]) while True: val = obj.next() print val for循环语法内部 上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。 如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。 print type(obj) # 输出:<class '__main__.Foo'> 表示,obj 对象由Foo类创建 print type(Foo) # 输出:<type 'type'> 表示,Foo类对象由 type 类创建 所以,obj对象是Foo类的一个实例,Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。 那么,创建类就可以有两种方式: a). 普通方式 class Foo(object): def func(self): print 'hello World" b).特殊方式(type类的构造函数) def func(self): print 'hello World' Foo = type('Foo',(object,), {'func': func}) #type第一个参数:类名 #type第二个参数:当前类的基类 #type第三个参数:类的成员 ==》 类 是由 type 类实例化产生 那么问题来了,类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象? 答:类中有一个属性__metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为__metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册