类对象、实例对象、类方法、实例方法、类属性、实例属性、静态方法、property

类对象、类属性与实例对象、实例属性的区别

在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性。类属性在内存中只有一份,在__init__外部定义。

通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性。实例属性在各自对象的内存中都保存一份,在__init__方法内部定义。

class Province(object):
    # 类属性
    country = '中国'

    def __init__(self, name):
        # 实例属性
        self.name = name

# 创建一个实例对象
obj = Province('山东省')
# 直接访问实例属性
print(obj.name)
# 直接访问类属性
Province.country

实例对象里面修改类属性: obj1.__class__.county = '香港'

实例方法、类方法、静态方法的区别

这三种方法都是保存在类的内存中,调用者不同。

  • 实例方法由对象调用,至少一个self参数,self代表对象的引用。
  • 类方法有类调用,至少一个cls参数,并且需要装饰器@classmethod修饰。
  • 静态方法由类调用,不需要参数,需要装饰器@staticmethod修饰。

创建原则:

  • 只要访问了成员变量的方法都叫实例方法
  • 只访问类变量的方法叫类方法
  • 既不访问成员变量,也不访问类变量的方法叫成静态方法
class Car(object):      # 类对象
    car_num = 0   # 类属性,在__init__外部定义。

    def __init__(self, brand, price):
        self.brand = brand  # 实例属性,在__init__内部定义
        self.price = price
        Car.car_num += 1

    def level(self):        # 实例方法,调用了实例属性
        if self.price > 300000:
            print(f"{self.brand}是高级轿车")
        else:
            print(f"{self.brand}是非高级轿车")

    @classmethod
    def car_count(cls):     # 类方法,只访问类变量
        print(f"我有{cls.car_num}辆车")

    @staticmethod
    def tips():     # 静态方法,既不访问成员变量,也不访问类变量
        print("温馨提示:开车不喝酒")


if __name__ == "__main__":
    bmw = Car("宝马", 200000)     # 通过类创建的对象称为实例对象
    bmw.level()
    wlhg = Car("五菱宏光", 400000)
    wlhg.level()
    Car.car_count()     # 调用类方法
    Car.tips()      # 调用静态方法

静态方法既不访问成员变量,也不访问类变量,若写个和class同级别的def函数也能实现同样的功能,何必定义个静态方法呢?定义静态方法主要是规避两个模块调用同名函数的情况, 

property 模块:调用property属性,不用写括号,把原来的调用实例方法看上去像调用一个实例属性

class Foo:

    def func(self):
        pass

    # 定义property属性
    @property
    def prop(self):  # 只能有一个self,不能有其他参数
        return 100

foo_obj = Foo()
foo_obj.func()  # 调用实例方法
ret = foo_obj.prop  # 调用property属性,不用写括号,把原来的调用实例方法看上去像调用一个实例属性
print(ret)

翻页demo 

class Pager:

    def __init__(self, current_page):
        # 用户当前请求的页码(第一页、第二页...)
        self.current_page = current_page
        # 每页默认显示10条数据
        self.per_items = 10

    @property
    def start(self):
        val = (self.current_page - 1) * self.per_items
        return val

    @property
    def end(self):
        val = self.current_page*self.per_items
        return val

p = Pager(1)
p.start
p.end

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
除了使用反射机制以外,TypeScript 还提供了其他一些方法来获取的所有属性方法。下面是两种常用的方法: 1. 使用 `Object.keys()` 函数来获取的所有属性名,然后再通过属性名获取对应的值。 ```typescript class MyClass { private privateProperty: string; public publicProperty: number; constructor() { this.privateProperty = 'private property'; this.publicProperty = 123; } private privateMethod() { console.log('private method'); } public publicMethod() { console.log('public method'); } } const myInstance = new MyClass(); // 获取的所有属性 const properties = Object.keys(myInstance); console.log(properties); // ["privateProperty", "publicProperty"] // 获取的所有方法 const methods = Object.keys(MyClass.prototype).filter((property) => typeof myInstance[property] === 'function'); console.log(methods); // ["privateMethod", "publicMethod"] ``` 2. 使用 `Reflect.ownKeys()` 函数来获取的所有属性方法名称。 ```typescript class MyClass { private privateProperty: string; public publicProperty: number; constructor() { this.privateProperty = 'private property'; this.publicProperty = 123; } private privateMethod() { console.log('private method'); } public publicMethod() { console.log('public method'); } } const myInstance = new MyClass(); // 获取的所有属性方法 const propertiesAndMethods = Reflect.ownKeys(myInstance); console.log(propertiesAndMethods); // ["privateProperty", "publicProperty", "privateMethod", "publicMethod"] ``` 这两种方法都可以获取的所有属性方法,你可以根据自己的需求选择其中一种。需要注意的是,这些方法只能获取到实例属性方法,无法获取静态属性方法。如果你需要获取静态成员,你可以通过本身直接访问。例如,`MyClass.staticProperty` 和 `MyClass.staticMethod`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值