类和对象

synchronized 之 对象锁 和 类锁

本小妞迷上赌 提交于 2019-12-10 02:50:27
一、synchronized(object) 如果object没有被加锁,则获取object的锁;如果object已经被加锁则等待object的锁被释放。 二、需要加锁的情景 多线程共享同一资源会引起线程安全的情况下,才需要加同步锁。不同的对象在不同的线程中时(如:A类的A1对象,和A类的A2对象,分别在线程a1和a2中),是不存在线程安全问题的。 三、synchronized的几种用法或者是形式 大致可以分为两种情况 synchronized修饰非静态方法、同步代码块的synchronized (this)用法和synchronized (非this对象) synchronized修饰静态方法以及同步代码块的synchronized (类.class) 四、理解 synchronized修饰非静态方法 和 synchronized(this) 用synchronized修饰方法和用synchronized(this)获取的是该对象的锁 synchronized同步方法 对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态; 同一时间只有一个线程执行synchronized同步方法中的代码。 synchronized(this)同步代码块 对其它的synchronized同步方法或synchronized(this

关于类和对象的一些BIF

拈花ヽ惹草 提交于 2019-12-10 01:50:35
1.issubclass(class, classinfo),这个函数是用来判断第一个参数(class)是否是第二个参数(classinfo)的子类,如果是的话就返回True。其中class info参数可以是一个元组,只要class是其中任何一个候选类的子类,就会返回True,例如: class A : pass class B ( A ) : pass print ( issubclass ( B , A ) ) print ( issubclass ( B , B ) ) print ( issubclass ( B , object ) ) 结果是:True,True,True 2.isinstance(object, classinfo),这个函数是用来判断第一个参数(object)是否是第二个参数(classinfo)的实例化对象,如果是的话就返回True,其中classinfo参数可以是一个元组,只要class是其中任何一个候选类的子类,就会返回True,例如: class A : pass class B ( A ) : pass class C : pass b1 = B ( ) print ( isinstance ( b1 , B ) ) print ( isinstance ( b1 , C ) ) print ( isinstance ( b1 , A )

Python类中特殊方法__eq__和__hash__的关系

♀尐吖头ヾ 提交于 2019-12-10 01:47:39
class Point ( object ) : def __init__ ( self , x , y ) : self . x = x self . y = y def __repr__ ( self ) : return repr ( ( self . id , self . x , self . y ) ) def __eq__ ( self , other ) : return self . x == other . y and self . y == self . y def __hash__ ( self ) : return hash ( ( self . x , self . y ) ) 上面定义了一个二维点的类其中 __repr__ 主要用来以一个字符串表示该类的实例,例如 Point(1,2) ,在调试时打印该点会获得字符串 (1,2) 。 当对两个点的实例进行值的比较时,比如 p1=Point(1,1) p2=Point(1,2) ,判断 p1==p2 时 __eq__() 会被调用,用以判断两个实例是否相等。在上述代码中定义了只要x和y的坐标相同,两个点相等。需要注意, __eq__() 对 is 不生效, == 是比较的值,而 is 比较的是引用,也就是内存地址。举个例子, p1=Point(1,1) p2=Point(1,1) , p1==p2 为

python(类和对象相关知识)

故事扮演 提交于 2019-12-09 23:23:22
类与对象的关系:对象都是由类产生的。 实例化:由类生产对象的过程。 类的属性分为数据属性(变量)和函数属性(函数,也叫方法)。 类和对象都使用点来访问。 一个简单的类 # -*- coding: utf-8 -*- class car: '这是一个车的类' #类的说明 wheel='橡胶' Engine='发动机' def transport(self): print('---拉货---') def manned(self): print('---载人---') print(car.__dict__) #查看类的属性字典 print(car.wheel) car.transport('1')  查看类的属性 # -*- coding: utf-8 -*- class car: '这是一个车的类' #类的说明 wheel='橡胶' Engine='发动机' def transport(self): print('---拉货---') def manned(self): print('---载人---') print(car.__name__) #查看类名 print(car.__doc__) #查看类的说明文档 print(car.__base__) #查看类的祖先 print(car.__bases__) #查看类的祖先(元组形式) print(car.__module__)

类、方法、成员变量和局部变量的可用修饰符

≯℡__Kan透↙ 提交于 2019-12-09 22:58:00
1、抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。原因如下:抽象方法没有方法体,是用来被继承的,所以不能用private修饰;static修饰的方法可以通过类名来访问该方法(即该方法的方法体),抽象方法用static修饰没有意义;使用synchronized关键字是为该方法加一个锁。。而如果该关键字修饰的方法是static方法。则使用的锁就是class变量的锁。如果是修饰类方法。则用this变量锁。但是抽象类不能实例化对象,因为该方法不是在该抽象类中实现的。是在其子类实现的。所以。锁应该归其子类所有。所以。抽象方法也就不能用synchronized关键字修饰了;native,这个东西本身就和abstract冲突,他们都是方法的声明,只是一个吧方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于即把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢? 2、接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

ES6——类和对象

孤街醉人 提交于 2019-12-09 12:04:28
1、es6中类的创建方发: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>类和对象</title> </head> <body> <script> //1、创建一个类 class Star{ //这是构造函数 constructor(uanme,age){ this.uname = uanme; this.age = age; } } //2、创建对象 var ldh = new Star('刘德华',50); var zxy = new Star('张学友',52); console.log(ldh.uname,ldh.age); console.log(zxy.uname,zxy.age); </script> </body> </html> 这样就可以创建一个简单的类。 2、类方法的创建: <script> //1、创建一个类 class Star{ //这是构造函数 constructor(uanme,age){ this.uname = uanme; this.age = age; } //类方法的创建,不需要写function关键字 //多个方法之间不需要用表单符号隔开 sing(name){ console.log(this.uname+'正在唱歌'+',歌曲:'+name)

类和对象总结

对着背影说爱祢 提交于 2019-12-08 10:36:30
一、类的三大属性:   1、封装:针对的是属性,把属性封装到对象中,保护属性的安全。可通过__name或者_name的方式,getter和setter的方法来间接访问和修改实例的属性,可通过@property装饰器来修饰get_name方法,把该方法的调用改为属性的访问。通过@name.setter装饰器来修饰set_name方法,把该方法的调用改为属性的修改。   2、继承:针对的是类本身,通过子类继承父类的功能,实现代码的复用,程序的简化,功能的扩展,符合OCP(开闭原则),扩展开放修改开闭的原则   3、多态:多态针对的是方法,不同类型的对象可以调用同一个方法或者函数,只要此类对象拥有相同的属性。如len()方法,实质是函数的重载,保证了代码的灵活性   --封装保证了数据的安全性,继承保证了程序的扩展性,多态保证了程序的灵活性。 二、类属性VS实例属性   --直接定义在类代码块的变量叫做类属性,类和实例都可访问,但只能是类可以进行修改。只有那些公共的属性才会放到类属性中,使用不多。   --通过__init__方法初始化或者对象属性直接赋值的方法获得的属性叫做实例属性,实例可以访问,类不能够访问。 三、类方法VS实例方法   --类方法:通过@classmethod装饰器装饰的方法称为类方法,方法中的形参为(cls),类和实例都可访问类方法。   --实例方法

Scala学习笔记(5)-类和方法

梦想与她 提交于 2019-12-07 20:49:20
Scala里的类和方法的概念都是差不多的,这里只列出Scala重要的一些概念: 1.Public是Scala的缺省访问级别,可以省略不写。 2.Scala里方法参数的一个重要特征是它们都是val,不是var(参数是val的理由是val更容易讲清楚,你不需要多看代码以确定是否val被重新赋值,而var则不然。)如果你想在方法里面给参数重新赋值,结果是编译失败。 3.如果方法没有发现任何显式的返回语句,Scala将返回方法中最后一个计算得到的值。 4.对于方法来说推荐的风格实际是避免显式的尤其是多个返回语句。代之以把每个方法当作是创建返回值的表达式。这种哲学将鼓励你制造很小的方法,把较大的方法分解为多个更小的方法。另一方面,设计选择取决于设计内容,Scala使得编写具有多个,显式的return的方法变得容易,如果那的确是你期望的。 5.带有大括号但没有等号的,在本质上当作是显式定义结果类型为Unit的方法。 def g() { "this String gets lost too" } 当你去掉方法体前面的等号时,它的结果类型将注定是Unit。不论方法体里面包含什么都不例外,因为Scala编译器可以把任何类型转换为Unit。例如,如果方法的最后结果是String,但方法的结果类型被声明为Unit,那么String将被转变为Unit并失去它的值。 def f(): Unit =

C++ 类(构造函数和析构函数)

≡放荡痞女 提交于 2019-12-07 08:25:58
文章概述 构造函数和析构函数的由来? 构造函数和析构函数的基本语法 C++编译器构造析构方案 PK 对象显示初始化方案 构造函数的分类以及调用 默认的构造函数 构造函数调用规则 构造函数和析构函数的总结 构造函数和析构函数的由来 类的数据成员不能在类的声明时候初始化,为了解决这个问题? 使用构造函数处理对对象的初始化。构造函数是一种特殊的成员函数,与其他函数不同,不需要用户调用它,而是创建对象的时候自动调用。析构函数是对象不再使用的时候,需要清理资源的时候调用。 构造函数和析构函数的基本语法 a. 构造函数: C++中的类需要定义与类名相同的特殊成员函数时,这种与类名相同的成员函数叫做构造函数; 构造函数可以在定义的时候有参数; 构造函数没有任何返回类型。 构造函数的调用: 一般情况下,C++编译器会自动的调用构造函数。特殊情况下,需要手工的调用构造函数。 class Test { public : //构造函数 Test() { } } b. 析构函数: C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的函数是析构函数; 析构函数没有参数和没有任何返回类型; 析构函数在对象销毁的时候自动调用; 析构函数调用机制: C++编译器自动调用。 class Test { ~ Test () { } } C++编译器构造析构方案 PK 对象显示初始化方案 class Test {

【c++】类的构造函数和析构函数

天大地大妈咪最大 提交于 2019-12-07 07:37:42
【c++】类的构造函数和析构函数 一.构造函数 二.构造函数的重载 三.析构函数 参考: 《c++从入门到精通》 人民邮电出版社 一.构造函数 构造函数是和类名相同的一个函数,它的作用是实现对象的初始化。当对象被创建时,构造函数自动被调用。 特点: 1.没有类型 2.没有返回值(也不用写void) 3.名字与类名相同 4.可重载! 作用 :完成类的对象的初始化 Cdate d; //定义对象d 注意: 当对象d被创建时,会自动调用构造函数 d.Cdate()。 当类中未定义构造函数时,编译器会自动假设存在以下两个默认构造函数:(此构造函数什么都不做,就是个形式)。如果作者自己定义了构造函数,则默认的构造函数不会存在。 //默认构造函数一 Cdate::Cdate() { } //默认构造函数二 Cdate::Cdate(const Cdate& a) { } 编程实例: //构造函数.cpp #include<iostream> using namespace std; class Cdate { public: Cdate(int ,int ,int ); //构造函数 void print(); //成员函数 private: int year,month,day; //成员数据 }; // 构造函数的实现 Cdate::Cdate(int x,int y,int z) /