类特殊成员(属性和方法)

Python下划线命名模式 - 小结

以下是一个简短的小结,即"速查表",罗列了我在本文中谈到的五种Python下划线模式的含义:

因为python中所有类默认继承object类。而object类提供了了很多原始的内建属性和方法,所以用户自定义的类在Python中也会继承这些内建属性。可以使用dir()函数可以查看,虽然python提供了很多内建属性但实际开发中常用的不多。而很多系统提供的内建属性实际开发中用户都需要重写后才会使用。对于python来说,属性或者函数都可以被理解成一个属性

[[email protected] method]# cat demo2.py
class Person:
    pass

print(dir(Person))   #使用dir 函数查看内建属性
[[email protected] method]# py demo2.py
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
[[email protected] method]# 

1.常用内建属性:__init__和__new__

1.__init__方法使用与功能:
  1.用来构造初始化函数,用来给类的实例进行初始化属性,所以可以不需要返回值
  2.在创建类的实例时系统自动调用
  3.自定义类如果不定义的话,默认调用父类object的,同理继承也是,子类若无,调用父类,若有,调用自己的
class Student(object):
    def __init__(self,name):
        self.name = name
        print("这是__init__方法")

s = Student("tom")
‘‘‘
这是__init__方法
2.__new__方法使用与功能
  1.__new__功能:用所给类创建一个对象,并且返回这个对象。
  2.因为是给类创建实例,所以至少传一个参数cls,参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
  3.在类实例化时内部创建类实例的函数,并且返回这个实例,所以它是类实例时最先被调用的方法,一般不要人为定义该方法。
  4.因为要创建实例返回实例,所以要有返回值。return父类__new__出来的实例,或者直接是object的__new__出来的实例   

class Student(object):
    def __init__(self,name):
        self.name = name
        print("这是__init__方法")

    def __new__(cls, *args, **kwargs):
        print("这是__new__方法")
        return object.__new__(cls)

s = Student("tom")
‘‘‘结果如下:注意__new__的执行顺序在__init__之前
这是__new__方法
这是_init__方法
‘‘‘

3.__init__和__new__使用的联系
  1.__init__第一个参数是self,表示需要初始的实例,由python解释器自动传入,而这个实例就是这个__new__返回的实例#那么理解就是在类实例化的过程中需要先通过__new__  进行实列化返回一个实例,然后这个实例再有 __init__进行实例初始化
[[email protected] method]# cat demo5.py
#coding:utf-8

class test:
    def __new__(cls,name,age):    #先通过__new__ 内置属性定义实列,然后交给 init 初始化实例,如果__new__ 没有完成后面就不会进行
        if 0 < age < 50:
            return object.__new__(cls)
        else:
            return None

    def __init__(self,name,age):

        print(‘__init__ age:‘, age)

a = test(‘aaa‘,30)
b = test(‘aaifffa‘,100)
[[email protected] method]# py demo5.py
__init__ age: 30
[[email protected] method]# 
3.__init__和__new__使用的联系
  1.__init__第一个参数是self,表示需要初始的实例,由python解释器自动传入,而这个实例就是这个__new__返回的实例
  2.然后 __init__在__new__的基础上可以完成一些其它初始化的动作

class Student(object):
    def __init__(self,name):
        self.name = name
        print("这是__init__方法")

    def __new__(cls, *args, **kwargs):
        print("这是__new__方法")
        id =object.__new__(cls)
        print(id) #打印这个__new__创建并返回的实例在内存中的地址
        return id
s1 = Student("JACK")
print(s1)
‘‘‘
这是__new__方法
<__main__.Student object at 0x000001EC6C8C8748>
这是__init__方法
<__main__.Student object at 0x000001EC6C8C8748>
‘‘‘
 

Python __repr__()方法:显示属性

[[email protected] method]# cat demo6.py
class Item:
    def __init__ (self, name, price):
        self.name = name
        self.price = price
# 创建一个Item对象,将之赋给im变量
im = Item(‘鼠标‘, 29.8)
# 打印im所引用的Item对象
print(im)
print(im.__repr__)
[[email protected] method]# py demo6.py
<__main__.Item object at 0x7f7628881290>
<method-wrapper ‘__repr__‘ of Item object at 0x7f7628881290>
[roo[email protected] method]# 
[[email protected] method]# cat demo7.py
#coding:utf-8

class Apple:
    def __init__(self,color,weight):
        self.color = color
        self.weight = weight
    def __repr__(self):
        return ‘Apple class‘+self.color+str(self.weight)

a = Apple(‘red‘,8.88)
print(a)
[[email protected] method]# py demo7.py
Apple classred8.88
[[email protected] method]# #__repr__() 是一个非常特殊的方法,它是一个“自我描述”的方法,该方法通常用于实现这样一个功能:当程序员直接打印该对象时,系统将会输出该对象的“自我描述”信息,用来告诉外界该对象具有的状态信息。

Python __del__方法:销毁对象

与 __init__() 方法对应的是 __del__() 方法,__init__() 方法用于初始化 Python 对象,而 __del__() 则用于销毁 Python 对象,即在任何 Python 对象将要被系统回收之时,系统都会自动调用该对象的 __del__() 方法。

当程序不再需要一个 Python 对象时,系统必须把该对象所占用的内存空间释放出来,这个过程被称为垃圾回收(GC,Garbage Collector),Python 会自动回收所有对象所占用的内存空间,因此开发者无须关心对象垃圾回收的过程。
Python 采用自动引用计数(ARC)方式来回收对象所占用的空间,当程序中有一个变量引用该 Python 对象时,Python 会自动保证该对象引用计数为 1;当程序中有两个变量引用该 Python 对象时,Python 会自动保证该对象引用计数为 2,依此类推,如果一个对象的引用计数变成了 0,则说明程序中不再有变量引用该对象,表明程序不再需要该对象,因此 Python 就会回收该对象。

大部分时候,Python 的 ARC 都能准确、高效地回收系统中的每个对象。但如果系统中出现循环引用的情况,比如对象 a 持有一个实例变量引用对象 b,而对象 b 又持有一个实例变量引用对象 a,此时两个对象的引用计数都是 1,而实际上程序已经不再有变量引用它们,系统应该回收它们,此时 Python 的垃圾回收器就可能没那么快,要等专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收这种引用循环。

当一个对象被垃圾回收时,Python 就会自动调用该对象的 __del__ 方法。需要说明的是,不要以为对一个变量执行 del 操作,该变量所引用的对象就会被回收,只有当对象的引用计数变成 0 时,该对象才会被回收。因此,如果一个对象有多个变量引用它,那么 del 其中一个变量是不会回收该对象的。
[[email protected] method]# cat demo8.py
class Item:
    def __init__ (self, name, price):
        self.name = name
        self.price = price
    # 定义析构函数
    def __del__ (self):
        print(‘del删除对象‘)
# 创建一个Item对象,将之赋给im变量
im = Item(‘鼠标‘, 29.8)
x = im   # ①
# 打印im所引用的Item对象
del im
print(‘--------------‘)
[[email protected] method]# py demo8.py
--------------
del删除对象
[[email protected] method]# 

从上面程序的输出结果可以看到,del im 执行之后,程序并没有回收 Item 对象,只有等到程序执行将要结束时(系统必须回收所有对象),系统才会回收 Item 对象。

Python __dir__用法:列出对象的所有属性(方法)名

对象的 __dir__ 方法用于列出该对象内部的所有属性(包括方法)名,该方法将会返回包含所有属性(方法)名的序列。

当程序对某个对象执行 dir(object) 函数时,实际上就是将该对象的 __dir__() 方法返回值进行排序,然后包装成列表。

[[email protected] method]# cat demo9.py
class Item:
    def __init__ (self, name, price):
        self.name = name
        self.price = price
    def info ():
        pass
# 创建一个Item对象,将之赋给im变量
im = Item(‘鼠标‘, 29.8)
print(im.__dir__())  # 返回所有属性(包括方法)组成列表
print(‘----------------------------------------------------------------‘)
print(dir(im))  # 返回所有属性(包括方法)排序之后的列表
[[email protected] method]# py demo9.py
[‘name‘, ‘price‘, ‘__module__‘, ‘__init__‘, ‘info‘, ‘__dict__‘, ‘__weakref__‘, ‘__doc__‘, ‘__repr__‘, ‘__hash__‘, ‘__str__‘, ‘__getattribute__‘, ‘__setattr__‘, ‘__delattr__‘, ‘__lt__‘, ‘__le__‘, ‘__eq__‘, ‘__ne__‘, ‘__gt__‘, ‘__ge__‘, ‘__new__‘, ‘__reduce_ex__‘, ‘__reduce__‘, ‘__subclasshook__‘, ‘__init_subclass__‘, ‘__format__‘, ‘__sizeof__‘, ‘__dir__‘, ‘__class__‘]
----------------------------------------------------------------
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__le__‘, ‘__lt__‘, ‘__module__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘, ‘info‘, ‘name‘, ‘price‘]
[[email protected] method]# 

Python __dict__属性:查看对象内部所有属性名和属性值组成的字典

__dict__ 属性用于查看对象内部存储的所有属性名和属性值组成的字典,通常程序直接使用该属性即可。

程序使用 __dict__ 属性既可查看对象的所有内部状态,也可通过字典语法来访问或修改指定属性的值。例如如下程序:

[[email protected] method]# cat demo10.py
#coding:utf-8

class Item:
    def __init__(self, name ,price):
        self.name = name
        self.price = price
im = Item(‘computer‘,10000)

print(im.__dict__)
print(im.__dict__[‘name‘])

im.__dict__[‘name‘] = ‘鼠标‘
print(im.__dict__[‘name‘])

[[email protected] method]# py demo10.py
{‘name‘: ‘computer‘, ‘price‘: 10000}
computer
鼠标
[[email protected] method]# 

Python setattr()、getattr()、hasattr()函数用法详解

在动态检查对象是否包含某些属性(包括方法〉相关的函数有如下几个:
hasattr(obj, name):检查 obj 对象是否包含名为 name 的属性或方法。
getattr(object, name[, default]):获取 object 对象中名为 name 的属性的属性值。
setattr(obj, name, value,/):将obj 对象的 name 属性设为 value。

下面程序示范了通过以上函数来动态操作 Python 对象的属性:
[[email protected] method]# cat demo11.py
class Comment:
    def __init__ (self, detail, view_times):
        self.detail = detail
        self.view_times = view_times
    def info ():
        print("一条简单的评论,内容是%s" % self.detail)

c = Comment(‘疯狂Python讲义很不错‘, 20)
# 判断是否包含指定的属性或方法
print(hasattr(c, ‘detail‘)) # True
print(hasattr(c, ‘view_times‘)) # True
print(hasattr(c, ‘info‘)) # True
# 获取指定属性的属性值
print(getattr(c, ‘detail‘)) # ‘疯狂Python讲义很不错‘
print(getattr(c, ‘view_times‘)) # 20
# 由于info是方法,故下面代码会提示:name ‘info‘ is not defined
#print(getattr(c, info, ‘默认值‘))
# 为指定属性设置属性值
setattr(c, ‘detail‘, ‘天气不错‘)
setattr(c, ‘view_times‘, 32)
# 输出重新设置后的属性值
print(c.detail)
print(c.view_times)
[[email protected] method]# py demo11.py
True
True
True
疯狂Python讲义很不错
20
天气不错
32
[[email protected] method]# 

Python issubclass和isinstance函数:检查类型

Python 提供了如下两个函数来检查类型:

  • issubclass(cls, class_or_tuple):检查 cls 是否为后一个类或元组包含的多个类中任意类的子类。
  • isinstance(obj, class_or_tuple):检查 obj 是否为后一个类或元组包含的多个类中任意类的对象。
[[email protected] method]# cat demo12.py
# 定义一个字符串
hello = "Hello";
# "Hello"是str类的实例,输出True
print(‘"Hello"是否是str类的实例: ‘, isinstance(hello, str))
# "Hello"是object类的子类的实例,输出True
print(‘"Hello"是否是object类的实例: ‘, isinstance(hello, object))
# str是object类的子类,输出True
print(‘str是否是object类的子类: ‘, issubclass(str, object))
# "Hello"不是tuple类及其子类的实例,输出False
print(‘"Hello"是否是tuple类的实例: ‘, isinstance(hello, tuple))
# str不是tuple类的子类,输出False
print(‘str是否是tuple类的子类: ‘, issubclass(str, tuple))
# 定义一个列表
my_list = [2, 4]
# [2, 4]是list类的实例,输出True
print(‘[2, 4]是否是list类的实例: ‘, isinstance(my_list, list))
# [2, 4]是object类的子类的实例,输出True
print(‘[2, 4]是否是object类及其子类的实例: ‘, isinstance(my_list, object))
# list是object类的子类,输出True
print(‘list是否是object类的子类: ‘, issubclass(list, object))
# [2, 4]不是tuple类及其子类的实例,输出False
print(‘[2, 4]是否是tuple类及其子类的实例: ‘, isinstance([2, 4], tuple))
# list不是tuple类的子类,输出False
print(‘list是否是tuple类的子类: ‘, issubclass(list, tuple))
[[email protected] method]# py demo12.py
"Hello"是否是str类的实例:  True
"Hello"是否是object类的实例:  True
str是否是object类的子类:  True
"Hello"是否是tuple类的实例:  False
str是否是tuple类的子类:  False
[2, 4]是否是list类的实例:  True
[2, 4]是否是object类及其子类的实例:  True
list是否是object类的子类:  True
[2, 4]是否是tuple类及其子类的实例:  False
list是否是tuple类的子类:  False
[[email protected] method]# 
__bases__    和__subclasses__()
[[email protected] method]# cat demo13.py
#coding:utf-8

class A:
    pass
class B(A):
    pass
class C(A):
    pass
#类的 __bases__ 属性查看该类的直接父类
print(‘类A 的所有父类:‘,A.__bases__)
print(‘类B 的所有父类:‘,B.__bases__)
print(‘类C 的所有父类:‘,C.__bases__)
#类的 __subclasses_() 方法。查看该类的所有直接子类

print(‘类A 的子类:‘,A.__subclasses__())
print(‘类B 的子类:‘,B.__subclasses__())
[[email protected] method]# py demo13.py
类A 的所有父类: (<class ‘object‘>,)
类B 的所有父类: (<class ‘__main__.A‘>,)
类C 的所有父类: (<class ‘__main__.A‘>,)
类A 的子类: [<class ‘__main__.B‘>, <class ‘__main__.C‘>]
类B 的子类: []
[[email protected] method]# 

原文地址:https://www.cnblogs.com/zy09/p/11686814.html

时间: 2024-11-02 11:37:17

类特殊成员(属性和方法)的相关文章

PHP 如何定义类、成员属性及其操作与魔术方法

PHP 类的定义与属性 一.类的定义类的关键字定义使用 class :例:class test{ } 二.类的属性与方法 class test{ $name = 'LH' ; //成员属性........ //成员方法........public function t1(){ } }三.定义一个不能继承的类 final class test{ }//final关键字只能修饰类和方法.不能用来修饰成员属性! 四.类.成员属性及方法的声明 1.public //公用的 表示全局的,类内部外部子类都可

PHP如何定义类及其成员属性与操作

1.类的定义: 类的关键字定义使用class 1.定义一个空类 Class Person{}; 2.定义一个有成员属性和操作的类 Class Person{ //成员属性 $name     =  ''; //操    作 protected function getActionName() { return $this->name; } } 3.定义一个不能被继承的类,使用final关键字 Final class Person{ 成员属性........ 操    作........ } 4.

final修饰的类,其属性和方法默认是被final修饰的吗?

在论坛上,看到一个问题,当然,各位聪明的客官想必已经知道问题是什么了,嘿嘿,没错就是文章的标题:final修饰的类,其属性和方法默认是被final修饰的吗? 老实说,刚开始看到这个问题的时候,有点懵...(现场捕获懵比一只:),嘻嘻),之前学习的语法什么的,隔了太久忘记了...既然忘记了,就写个程序进行测试下吧 嘻嘻,以下是测试的程序:(小程序中用到了反射机制,还没学习到的客官,可以先去了解下哈:) ) /** * DateAndTime: 2016-12-13下午10:38:08 */ pac

NetTcpBinding 类nettcpbinding的属性和方法

  一种适合于跨计算机通信的安全可靠的绑定. 继承层次结构 System.Object   System.ServiceModel.Channels.Binding    System.ServiceModel.NetTcpBinding      System.ServiceModel.NetTcpContextBinding 命名空间:  System.ServiceModel程序集:  System.ServiceModel(在 System.ServiceModel.dll 中) 语法

c#遍历并判断实体或类的成员属性

c#的Attribute有些类似java中的annotation,可以方便地在类成员中做修饰/限制作用. Demo: class ss { public stat BsonDocument Iterator(object obj){ MyAttr currAttr = null;// 自定义注解类 Type type = obj.GetType();// obj为传入的对象参数 //获取类名 String className = type.Name; //获取所有公有属性 PropertyInf

UIView类的常用属性与方法

UIView表示屏幕上的一块矩形区域,它在App中占有绝对重要的地位,因为IOS中几乎所有可视化控件都是UIView的子类.负责渲染区域的内容,并且响应该区域内发生的触摸事件. UIView的功能:1.管理矩形区域里的内容2.处理矩形区域中的事件3.子视图的管理 4.还能实现动画 UIView的子类也具有这些功能. 1.UIView中的三个结构体CGPoint.CGSize.CGRect 1.  CGPoint//点结构体 1 struct CGPoint { 2 CGFloat x; 3 CG

如何修改类的成员属性的默认值

这是一道黑马入学测试题: 存在一个JavaBean,它包含以下几种可能的属性: 1:boolean/Boolean 2:int/Integer 3:String 4:double/Double 属性名未知,现在要给这些属性设置默认值,以下是要求的默认值: String类型的默认值为 字符串     www.itheima.com int/Integer类型的默认值为100boolean/Boolean类型的默认值为true double/Double的默认值为0.01D. 只需要设置带有getX

一个类怎样引用另外一个类的成员变量或方法

通常常用的有:A类有个变量C,B类想调用C方法一:变量C是非静态的(static),那么在B类中创建一个A类的对象,用对象.变量名就可以了方法二:变量C是静态的(static),直接用类.变量名 详细的可以参考这个文库:http://wenku.baidu.com/link?url=tyAAmJNGxBnXLnGLDK5of8B23KOMltUXNIA3rpD6U23F460ot_y7GVfy51utrku2T6wyzUgjX5WodmY623D5PGDWY-wr3UCxzzfVpn5I0E3

[.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要