Python面向对象编程

类与对象是面向对象编程的两个主要方面。一个类(Class)能够创建一种新的类型(Type),其中对象(Object)就是类的实例(Instance)。可以这样来类比:你可以拥有类型 int 的变量,也就是说存储整数的变量是 int 类的实例(对象)。

对象可以使用属于它的普通变量来存储数据。这种从属于对象或类的变量叫作字段(Field)。对象还可以使用属于类的函数来实现某些功能,这种函数叫作类的方法(Method)。这两个术语很重要,它有助于我们区分函数与变量,哪些是独立的,哪些又是属于类或对象的。总之,字段与方法通称类的属性(Attribute)。

字段有两种类型——它们属于某一类的各个实例或对象,或是从属于某一类本身。它们被分别称作实例变量(Instance Variables)与类变量(Class Variables)。


self:Python 中的 self 相当于 C++ 中的 this 指针以及 Java 与 C# 中的 this 引用。


class创建类:
p = name() 创建对象

class Person():
    pass #空的代码块

p = Person()
print(p)

方法

类与对象一如函数那般都可以带有方法(Method),唯一的不同在于我们还拥有一个额外的 self 变量

class Person():
    def say_hello():
        print('hello')

p = Person()
p.say_hi()#还可以写作 Person.say_hello()

init

_init_ 方法会在类的对象被实例化(Instantiated)时立即运行。这一方法可以对任何你想进行操作的目标对象进行初始化(Initialization)操作

class Person:
    def __init__(self, name):
        self.name = name

    def say_hi(self):
        print('Hello, my name is', self.name)

p = Person('Swaroop')
p.say_hi()

类的字段(类变量与对象变量)

数据部分——只不过是绑定(Bound)到类与对象的命名空间(Namespace)的普通变量。这就代表着这些名称仅在这些类与对象所存在的上下文中有效。这就是它们被称作“命名空间”的原因。

类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。该类变量只拥有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有实例中都会得到体现。

对象变量(Object variable)由类的每一个独立的对象或实例所拥有。在这种情况下,每个对象都拥有属于它自己的字段的副本,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的字段产生关联

class Robert():
    population = 0
    def __init__(self,name):
        self.name = name
        print("Initializing{}".format(self.name))
        Robert.population += 1
    def die(self):
        print("{} is being destoryed!".format(self.name))
        Robert.population -= 1
        if Robert.population == 0:
            print("{} was the last one".format(self.name))
        else:
            print("The are still {:d} Robert working".format(self.population))

    def say_hi(self):
        print("hello my friend,my name is {} ".format(self.name))

    @classmethod
    def how_many(cls):
        print("we have {:d} roberts".format(cls.population))
droid1 = Robert("R2-D2")
droid1.say_hi()
Robert.how_many()

droid2 = Robert("R2-D3")
droid2.say_hi()
Robert.how_many()

droid2.die()

Robert.how_many()

how_many 实际上是一个属于类而非属于对象的方法。这就意味着我们可以将它定义为一个 classmethod(类方法) 或是一个 staticmethod(静态方法),这取决于我们是否需要知道这一方法属于哪个类。由于我们已经引用了一个类变量,因此我们使用 classmethod(类方法)。


继承

子类,派生类对父类,基类的继承;
意思就是对代码的重用,也就是继承的意思;

举个例子:假设你希望编写一款程序来追踪一所大学里的老师和学生。有一些特征是他们都具有的,例如姓名、年龄和地址。另外一些特征是他们独有的,一如教师的薪水、课程与假期,学生的成绩和学费。
你可以为每一种类型创建两个独立的类,并对它们进行处理。但增添一条共有特征就意味着将其添加进两个独立的类。这很快就会使程序变得笨重。
一个更好的方法是创建一个公共类叫作 SchoolMember,然后让教师和学生从这个类中继承(Inherit),也就是说他们将成为这一类型(类)的子类型,而我们就可以向这些子类型中添加某些该类独有的特征。
这种方法有诸多优点。如果我们增加或修改了 SchoolMember 的任何功能,它将自动反映在子类型中。举个例子,你可以通过简单地向 SchoolMember 类进行操作,来为所有老师与学生添加一条新的 ID 卡字段。不过,对某一子类型作出的改动并不会影响到其它子类型。另一大优点是你可以将某一老师或学生对象看作 SchoolMember 的对象并加以引用,这在某些情况下会大为有用,例如清点学校中的成员数量。这被称作多态性(Polymorphism),在任何情况下,如果父类型希望,子类型都可以被替换,也就是说,该对象可以被看作父类的实例。
同时还需要注意的是我们重用父类的代码,但我们不需要再在其它类中重复它们,当我们使用独立类型时才会必要地重复这些代码。

class SchoolMeber():
    def __init__(self, name,age)self.name = name
        self.age = age
        print("Initialized SchoolMenber:{}".format(self.name))
    def tell():
        print("Name: {},Age: {}".format(self.name,self.age),end=")
class Teacher(SchoolMenber):
    def __init__(self, name,age,salary):
        SchoolMember.__init__(self, name,age)
        self.salary = salary
        print("Initialized Teacher:{}".format(self.name))
    def tell(self):
        SchoolMenber.tell(self)
        print('Salary:"{:d}"'..format(self.salary))

Python强大的格式化format:它通过{}和:来代替%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值