008--TypeScript存储器和静态属性

博客介绍了TypeScript的相关特性,包括支持对简单类进行getter和setter操作,可创建类的静态成员,有抽象类且一般作为派生类或基类,还提及类的高级技巧以及类可作为接口使用等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Typescript支持对一个简单的类进行getter和setter

//ts实现getter和setter
//这个文件只能编译成es5
let passCode = 'Secret Password'
class Employee {
 private _fullName: string
 get fullName(): string{
   return this._fullName
 }
 set fullName(newName: string) {
   if(passCode && passCode == 'Secret Password'){
     this._fullName = newName
   } else {
     console.error ('Error: Unauthorized update of employee!')
   }
 }
}
let employee = new Employee()
employee.fullName = 'BOb smith'
if (employee.fullName) {
  console.log(employee.fullName)//如果passCode正确,输出BOb smith
}

编译后的文件如下

//ts实现getter和setter
//这个文件只能编译成es5
var passCode = 'Secret Password';
var Employee = /** @class */ (function () {
    function Employee() {
    }
    Object.defineProperty(Employee.prototype, "fullName", {
        get: function () {
            return this._fullName;
        },
        set: function (newName) {
            if (passCode && passCode == 'Secret Password') {
                this._fullName = newName;
            }
            else {
                console.error('Error: Unauthorized update of employee!');
            }
        },
        enumerable: true,
        configurable: true
    });
    return Employee;
}());
var employee = new Employee();
employee.fullName = 'BOb smith';
if (employee.fullName) {
    console.log(employee.fullName); //如果passCode正确,输出BOb smith
}

创建类的静态成员,这些属性只存在类的本身

//静态属性的使用
//计算坐标系的一点到任一点的距离
class Grid {
  static orign = {x:0, y:0}//静态属性,可以直接使用

  scale: number //定义缩放比例

  constructor(scale: number) {
    this.scale = scale//把scale传给this,new函数的时候必须传入
  }

  //创建一个实例方法
  calculateDistanceFromOrign (point: {x:number; y: number}) {
    let xDist = point.x - Grid.orign.x //静态属性可以直接使用
    let yDist = point.y - Grid.orign.y
    //勾股定理
    return Math.sqrt(xDist * xDist + yDist * yDist) * this.scale 
  }
}

let grid1 = new Grid(1.0)
let grid2 = new Grid(5.0)
//勾3股4弦5
console.log(grid1.calculateDistanceFromOrign({x:3 , y:4}))//5
console.log(grid2.calculateDistanceFromOrign({x:3 , y:4}))//25

编译后的文件

//静态属性的使用
//计算坐标系的一点到任一点的距离
var Grid = /** @class */ (function () {
    function Grid(scale) {
        this.scale = scale; //把scale传给this,new函数的时候必须传入
    }
    //创建一个实例方法
    Grid.prototype.calculateDistanceFromOrign = function (point) {
        var xDist = point.x - Grid.orign.x; //静态属性可以直接使用
        var yDist = point.y - Grid.orign.y;
        //勾股定理
        return Math.sqrt(xDist * xDist + yDist * yDist) * this.scale;
    };
    Grid.orign = { x: 0, y: 0 }; //静态属性,可以直接使用
    return Grid;
}());
var grid1 = new Grid(1.0);
var grid2 = new Grid(5.0);
//勾3股4弦5
console.log(grid1.calculateDistanceFromOrign({ x: 3, y: 4 }));
console.log(grid2.calculateDistanceFromOrign({ x: 3, y: 4 }));

TypeScript抽象类

抽象类一般作为其他类的派生类或者基类使用,一般不能直接使用

abstract class Department {
  name: string
  constructor(name: string) {
    this.name = name
  }

  printName(): void{
    console.log('Department name ' + this.name)
  }

  abstract printMeeting(): void  //具体实现要在派生类中实现,这是个签名
}

class AccountingDepartment extends Department {
  constructor() {
    super('Accounting ad Auditing')
  }
  //实现抽象方法
  printMeeting(): void {
    console.log('The Accounting Department meets each monday at 10am') 
  }

  genterateReports(): void {
    console.log('Generating accounting reports.. ')
  }
}

let department: Department
//  department = new Department()//报错,无法创建抽象类的实例
department = new AccountingDepartment()
department.printName()
department.printMeeting()
//department.genterateReports()//定义的是Department类型,没有这个实例方法
//输出
// Department name Accounting ad Auditing
// The Accounting Department meets each monday at 10am

类的一些高级技巧

//类的一些高级技巧
class Greeter {
  static standgrdGreeting = 'Hello , there'

  greeting: string

  constructor(message: string) {
    this.greeting  = message
  }

  greet() {
    return 'Hello' + this.greeting
  }
}

let greeter: Greeter
greeter = new Greeter('world')
console.log(greeter.greet())//Helloworld

可以看到上面的代码有静态属性,有实例方法

//类的一些高级技巧
var Greeter = /** @class */ (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return 'Hello' + this.greeting;
    };
    //最开始把构造函数赋值给Greeter变量
    //静态属性编译后实际上是挂载在赋值后的Greeter上
    Greeter.standgrdGreeting = 'Hello , there';
    return Greeter;
}());
var greeter;
greeter = new Greeter('world');
console.log(greeter.greet());

改造后

//类的一些高级技巧
class Greeter {
  static standgrdGreeting = 'Hello , there'

  greeting: string

  //修改为可选参数
  constructor(message?: string) {
    this.greeting  = message
  }

  greet() {
    if(this.greeting){
    return 'Hello' + this.greeting
    }else {
      return Greeter.standgrdGreeting
    }
  }
}

let greeter: Greeter
greeter = new Greeter()
console.log(greeter.greet())//Hello , there

//如果我们相对standGreeting做修改怎么办呢?
let greetMaker: typeof  Greeter = Greeter
greetMaker.standgrdGreeting = 'Hey, htere'

let greeter2:Greeter = new greetMaker()
console.log(greeter2.greet())//Hey, htere

编译后

//类的一些高级技巧
var Greeter = /** @class */ (function () {
    //修改为可选参数
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        if (this.greeting) {
            return 'Hello' + this.greeting;
        }
        else {
            return Greeter.standgrdGreeting;
        }
    };
    Greeter.standgrdGreeting = 'Hello , there';
    return Greeter;
}());
var greeter;
greeter = new Greeter();
console.log(greeter.greet()); //Hello , there
//如果我们相对standGreeting做修改怎么办呢?
var greetMaker = Greeter;
greetMaker.standgrdGreeting = 'Hey, htere';
var greeter2 = new greetMaker();
console.log(greeter2.greet());

类作为接口使用

//目前已废弃
class Point {
  x: number
  y: number
}
 
interface Point3D extends Point{
z: number
}

let point3d: Point3D = {x: 1 ,y: 2, z: 3}

2019-05-27  17:40:40

转载于:https://www.cnblogs.com/ccbest/p/10932032.html

### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值