Python札记30_属性和数据

0.405字数 738阅读 10

类属性

class  A:
    x = 6 
A.x
image.png
  • 定义一个类A,A中有个变量x引用的对象是6
  • x称之为类A的属性,6称之为属性的值
  • A.x称之为调用类属性的方式
  • 如果想调用某个类的属性,使用英文的句号.
  • 类属性仅与其所定义的类绑定,这种属性本质上就是类中的变量。比如例子中,x是一个变量,也是类A的属性。
  • 类属性也称之为静态变量静态数据

在Python中万物皆对象,类也是对象。对象是有属性和方法的,类也有属性和方法。属性是可以进行增加和删除等操作的。

class A:
   x = 6    # 定义一个属性
A.x

A.y = 10   # 增加一个属性
del A.x  # 删除以后再调用则报错
A.y = 4   # 修改属性的值
dir(A)  # 通过dir查看具体的方法
['__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__']

A.__base__   # 显示父类
A.__dict__  # 以字典的形式显示类的所有属性和值
image.png
image.png
image.png
  • 类属性和类进行绑定,可以进行自定义、删除、修改等操作
  • 每个类都有特殊的属性,特殊属性不需要修改

创建实例和实例属性

创建实例

创建实例一般通过调用类来进行是实现。之前的例子总,boy实例就是通过调用了Person类来实现的。

class Person:       # 定义一个Person类
    """
    This is a sample of class   # 注释部分
    """
    
   def __init__(self, name):      # 初始化函数;传入另一个参数name
        self.name = name

    def get_name(self):
        return self.name      # 通过get_name函数返回self.name也就是初始化函数中参数name的值

    def color(self, color):
        d = { }   
        d[self.name] = color   # 向字典中添加键值name:color对并返回
        return d

# 调用Person类
if __name__ == "__main__":
    boy = Person("xiaoming")     # 利用Person类创建实例boy
    print(boy.name)
    name = boy.get_name()   # 加上括号的称之为方法(函数),调用函数即方法
    print(name)
    boy_color = boy.color("black")
    print(boy_color)
  • 类是实例的工厂,一个类可以创建多个实例。美女肯定不止西施一个,王昭君也是,赵飞燕也是,刘亦菲也是呀
  • 当类被调用后,就可以创建实例,并检查是否有__init__方法。
  • 没有则返回实例对象,有则调用,将实例对象作为第一个参数self传进去,理解这句话:实例是boy,当做参数传给self,就是说‘boy.name = name’

init函数

  • __init__()没有return语句 ,如果非要写,就写return None。下面的报错提示语法错误,init不能返回int对象。
    image.png
class Person:
    def __int__(self, name, lang="python", website="www.baidu.com"):  # 属性的另一种定义
        self.name = name  # name就是函数中传进来参数的值;lang、website相同
        self.lang = lang
        self.website = website
        self.email = "123456@qq.com"    # 增加一个属性
  • init初始化函数的第一个参数必须是self
  • init函数没有返回值

实例属性

与类相同,实例具有的属性称之为实例属性

class  A:
    x = 6 
foo = A()   # 根据类A创建一个实例foo,实例foo具有属性
foo.x
image.png
  • 实例的属性是可以变化的,能够进行修改;
  • 类的属性不能修改,类属性和类进行绑定,不受实例的影响;
foo.x += 1  # 修改实例属性
foo.x  # 结果是7
A.x   # 结果仍然是6
image.png
  • 实例的新属性将原来的覆盖,如果将新属性删除,原来的属性将能够进行访问


    image.png
  • 修改类的属性,实例属性跟着变化


    image.png

总结

  • 和类属性一样,实例也具有自己的属性
  • 实例属性能够进行任意修改
  • 实例属性的修改不影响类属性,即类属性不因实例属性而变化
  • 类属性能够影响实例属性,因为实例是通过调用类来实现的

特殊情形

当类中变量引用的是一个可变对象,类和实例的属性能够相互影响。

bar.y.append(5)  # 修改实例属性
bar.y
B.y   # 类的属性跟着改变
[1, 2, 3, 4, 5]

B.y.append(6)   # 修改类属性
B.y
bar.y  # 实例属性跟着变
[1, 2, 3, 4, 5, 6]
image.png

推荐阅读更多精彩内容