Python类成员

1.类成员

  • 类成员包括:类属性和类方法属于类,可以不实例化对象,直接通过类名调用,这些类成员为所有对象共有,一般用于对象间通信。
class Person:
    # 类属性必须在方法外面定义
    name = '姚圈圈'
    gender = '男'
    __age = 23            # 私有属性

    def __init__(self,name,age):
        self.name = name  # 实例属性或成员属性
        self.__age = age

# 实例化对象
qiao = Person('乔鸡鸡',20)
liu = Person('刘鸡鸡',30)

# 类属性调用方式:
# 类名.属性名
print(Person.name)         # 输出:姚圈圈
print(qiao.gender)         # 输出男

# 如果成员属性名和类属性名冲突,优先访问成员属性,成员属性屏蔽类属性
print(qiao.name)           # 输出:乔鸡鸡
print(liu.name)            # 输出:刘鸡鸡

# 私有属性不能通过类名直接访问
# print(Person.__age)        # AttributeError: type object 'Person' has no attribute '__age'

# 删除对象的属性
del liu.name
print(liu.name)              # 访问的是类属性 输出:姚圈圈

2.类方法和静态方法

  • 类方法属于类,为所有对象共有,可以通过类名对象调用
  • 类方法可以用来访问属性类
  • 静态方法属于类的作用域内的全局函数
  • 类方法和静态方法的区别,类方法第一个参数是类对象,由系统传入,静态方法没有
  • 共同点:静态方法和类方法都可以通过类名直接调用,属于类不属于对象
class Date:
    def __init__(self,year,moth,day):
        self.year = year
        self.moth = moth
        self.day = day

    @classmethod       # 类方法 直接调用
    def date_from_string(cls,date_string):
        '''
        :param cls 类对象,和类名作用一样
        :param date_string: 日期字符串,格式必须是yyyy-mm-dd
        :return: 日期对象
        '''
        year,moth,day = tuple(map(int,date_string.split("-")))
        return cls(year,moth,day)

    # 静态方法
    @staticmethod
    def is_validz_date(date_string):
        year,moth,day = tuple(map(int,date_string.split("-")))
        return year >= 0 and 1 < moth <= 12 and 0 < day <= 31

d1 = Date.date_from_string('2020-03-04')
print(d1.year,d1.moth,d1.day)            # 输出:2020 3 4
print(Date.is_validz_date('2020-03-05')) # 返回:True

3.类成员的动态绑定

  • 实例的属性和方法可以动态绑定,可以在程序运行期间可以给程序增加功能,对静态语言来来说无异于天方夜谭,对Python来说一切皆有可能
  • 给对象动态添加的属性只属于这个对象,其它对象没有该属性
  • 使用__slots__限制属性的动态绑定
class Cat:
    __slots__ = ('gender', 'name', 'age', 'kind')  # 这个个类的对象只能有这些属性

cat = Cat()

# 动态添加属性
cat.name = 'tom'
cat.gender = '公'

# 不能添加这个属性,语法错误
# cat.weight = 8  AttributeError: 'Cat' object has no attribute 'weight'

4.对象计数

    num = 0
    def __init__(self):
        # self.__class__当前对象所属的类
        self.__class__.num += 1
        
        # 不能通过self修改类属性
        # self.num = 10  # 定义了一个对象属性、

    def __del__(self):
        self.__class__.num -= 1

# 如果统计一个类实例化了多少个对象
d1 = Dog()
d2 = Dog()
d2.num = 100  #动态添加了一个对象属性

del d2
d3 = Dog()
print(Dog.num)  # 输出 2
print(d3.num)   # 输出 2

5.new&init

class Man:
    def __new__(cls, *args, **kwargs):
        print("new")
        # to do
        # 必须调用父类的new方法返回一个对象
        return super().__new__(cls)
    def __init__(self,age):
        print("init")
        self.age = age

man = Man(24)

Python成员包括属性和方法。属性是中的变量,用于存储数据。方法是中的函数,用于定义的行为和操作。在Python中,可以通过使用关键字定义一个,并在中定义属性和方法。属性可以通过在的初始化方法`__init__`中使用`self`关键字进行赋值,也可以直接在中定义。方法可以通过在中定义函数来创建,其中的参数可以包含`self`关键字,以便在方法内部访问的属性和方法。此外,Python还提供了装饰器`@classmethod`用于定义方法,这些方法可以在不创建的实例的情况下调用。方法使用`cls`参数来表示本身,并且可以访问的属性和方法。123 #### 引用[.reference_title] - *1* [Python成员介绍](https://blog.csdn.net/cnds123/article/details/130898914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [Python入门-成员](https://blog.csdn.net/aibing0103/article/details/102328451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [Python中的成员](https://blog.csdn.net/qq_62789540/article/details/122482850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值